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 .