A melhor maneira de passar o valor Foreign_key para o controlador Rails

Já faz quase uma semana desde que comecei a me aprofundar em formas, associações, hashes, símbolos ... Mas parece que não consigo resolver o quebra-cabeça sem a sua ajuda.

Estou trabalhando em um projeto para exibir diferentes conteúdos de galerias. A idéia básica é quando o usuário vê os nomes das galerias (nomes são links) para poder clicar na escolhida. Todas as imagens pertencentes a esta galeria são exibidas. Na parte inferior deve haver um link "Adicionar imagem nesta galeria".

Meus modelos:

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


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

Eu criei o índice no gallery_id para a tabela 'pictures'.

Meu grande problema aparece aqui, como passar o gallery_id para a ação do controlador 'new'. Como eu já vi em "Desenvolvimento Web ágil com Rails", pode ser:
<% = link_to 'Adicionar uma imagem aqui ...', novo caminho_da_imagem (: gallery_id => @ gallery.id)%>

Como parece neste caso, a Foreign_key: Gallery_id é exposta na barra de URL do navegador. O segundo problema é que: gallery_id está disponível para a função 'nova' do controlador, mas "desaparece" para a função 'criar' (causando um erro "Não foi possível encontrar a Galeria sem um ID"). O problema desapareceu quando adicionei um campo oculto no _form for pictures, no meu 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 %>

Aqui estão minhas definições no controlador 'pictures':

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

E finalmente a definição link_to em show.html.erb para galerias:

<% 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) %>

Aqui está a saída de depuração antes de enviar a imagem: ---! Map: ActiveSupport :: HashWithIndifferentAccess gallery_id: "6" action: new controller: pictures

e depois de enviar o botão 'criar' (com exceção):

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

Como você vê, não há nada como "gallery_id" no hash "pictures".

Resumindo minhas perguntas para você:

Existe uma maneira de passar a chave estrangeira sem o campo oculto?

Eu poderia esconder de alguma forma passar o formulário de chave estrangeira exibido na barra de URL?

Existe uma alternativa na transmissão de argumentos usando 'link_to'?

Obrigado .

questionAnswers(2)

yourAnswerToTheQuestion