La mejor manera de pasar el valor de Foreign_key al controlador Rails

Ha pasado casi una semana desde que comencé a profundizar en formas, asociaciones, hashes, símbolos ... Pero parece que no puedo resolver el rompecabezas sin su ayuda.

Estoy trabajando en un proyecto para mostrar el contenido de diferentes galerías. La idea básica es cuando el usuario ve los nombres de las galerías (los nombres son enlaces) para poder hacer clic en la elegida. Luego se muestran todas las imágenes que pertenecen a esta galería. En la parte inferior debe haber un enlace "Agregar imagen en esta galería".

Mis modelos:

 class Gallery < ActiveRecord::Base
attr_accessible  :name
has_many :pictures 
 end


class Picture < ActiveRecord::Base 
attr_accessible  :image 
belongs_to :gallery
 end

He creado un índice en gallery_id para la tabla 'imágenes'.

Mi gran problema aparece aquí, cómo pasar el gallery_id a la acción del controlador 'nuevo'. Como he visto en "Desarrollo web ágil con Rails" podría ser:
<% = link_to 'Agregar una imagen aquí ...', new_picture_path (: gallery_id => @ gallery.id)%>

Como parece en este caso, el Foreign_key: gallery_id está expuesto en la barra de URL del navegador. El segundo problema es que: gallery_id está disponible para la función 'nueva' del controlador, pero "desaparece" para la función 'crear' (provocando un error "No se pudo encontrar la galería sin un ID"). El problema desaparece cuando agrego un campo oculto en el _formulario para imágenes, en mi caso:

<%= form_for(@picture)   do |f| %>
<div class="field"> 
      <%= f.hidden_field :gallery_id , :value=>params[:gallery_id] %>
<%= f.label :image %><br />
<%= f.file_field :image %>
</div>

<div class="actions">
<%= f.submit "Create" %>
</div>
<% end %>

Aquí están mis definiciones en el controlador de 'imágenes':

def new
@gallery=Gallery.find(params[:gallery_id])
@[email protected] 
 end


def create
   @gallery = Gallery.find(params[:gallery_id])  
   @picture = @gallery.pictures.new(params[:picture])
  if @picture.save
     redirect_to(@picture, :notice => 'Picture was successfully created.')
  else    
     redirect_to(galleries ,:notice => 'Picture was NOT created.')
  end

 end

Y finalmente la definición de link_to en show.html.erb para galerías:

<% for picture in selpics(@gallery) %>
 <div id= "thumb" > 
 <%= image_tag picture.image %>
 </div>
<% end %>

 <%= link_to 'Add a picture here...',new_picture_path(:gallery_id=>@gallery.id) %>

Aquí está la salida de depuración antes de enviar la imagen: ---! Map: ActiveSupport :: HashWithIndifferentAccess gallery_id: "6" action: new controller: pictures

y después de enviar el botón 'crear' (con excepción):

{"utf8"=>"✓",
 "authenticity_token"=>"IGI4MfDgbavBShO7R2PXIiK8fGjkgHDPbI117tcfxmc=",
 "picture"=>{"image"=>"wilsonblx.png"},
 "commit"=>"Create"}

Como puede ver, no hay nada como "gallery_id" en el hash "pictures".

Resumiendo mis preguntas:

¿Hay alguna forma de pasar el Foreign_key sin hidden_field?

¿Podría ocultarme de alguna manera pasando el formulario de clave externa que se muestra en la barra de URL?

Existe una alternativa para pasar argumentos usando 'link_to'?

Gracias

Respuestas a la pregunta(2)

Su respuesta a la pregunta