フォーム、アソシエーション、ハッシュ、シンボルについて深く掘り下げ始めてからほぼ 1 週間が経ちましたが、皆さんの助けなしにはパズルを解くことはできないようです。
さまざまなギャラリー コンテンツを表示するプロジェクトに取り組んでいます。基本的な考え方は、ユーザーがギャラリーの名前 (名前はリンク) を見て、選択したギャラリーをクリックできるようにすることです。次に、このギャラリーに属するすべての画像が表示されます。下部に「このギャラリーに画像を追加」というリンクがあるはずです。
私のモデル:
class Gallery < ActiveRecord::Base
attr_accessible :name
has_many :pictures
end
class Picture < ActiveRecord::Base
attr_accessible :image
belongs_to :gallery
end
「pictures」テーブルの gallery_id にインデックスを作成しました。
私の大きな問題がここに表示されます。gallery_id をコントローラーのアクション 'new' に渡す方法です。「Rails を使用したアジャイル Web 開発」で見たように、次
のようになります。
この場合のように、foreign_key :gallery_id はブラウザの URL バーに表示されます。2 番目の問題は、:gallery_id がコントローラの「新しい」関数で使用できるが、「作成」関数では「消える」ことです (「ID のないギャラリーが見つかりませんでした」というエラーが発生します)。私の場合、写真の _form に隠しフィールドを追加すると、問題はなくなりました。
<%= 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 %>
「写真」コントローラーでの私の定義は次のとおりです。
def new
@gallery=Gallery.find(params[:gallery_id])
@picture=@gallery.pictures.build
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
最後に、ギャラリー用の show.html.erb の link_to 定義:
<% 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) %>
画像を送信する前のデバッグ出力は次のとおりです。 --- !map:ActiveSupport::HashWithIndifferentAccess gallery_id: "6" action: new controller: pictures
そして「作成」ボタンを送信した後(例外が発生しました):
{"utf8"=>"✓",
"authenticity_token"=>"IGI4MfDgbavBShO7R2PXIiK8fGjkgHDPbI117tcfxmc=",
"picture"=>{"image"=>"wilsonblx.png"},
"commit"=>"Create"}
ご覧のとおり、"pictures" ハッシュには "gallery_id" のようなものはありません。
あなたへの私の質問を要約すると:
hidden_field なしでforeign_keyを渡す方法はありますか?
URL バーに表示されている外部キー フォームを渡すことをどうにかして非表示にすることはできますか?
'link_to' を使用して引数を渡す方法はありますか?
ありがとうございました 。