4

フォーム、アソシエーション、ハッシュ、シンボルについて深く掘り下げ始めてからほぼ 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" のようなものはありません。

あなたへの私の質問を要約すると:

  1. hidden_​​field なしでforeign_keyを渡す方法はありますか?

  2. URL バーに表示されている外部キー フォームを渡すことをどうにかして非表示にすることはできますか?

  3. 'link_to' を使用して引数を渡す方法はありますか?

ありがとうございました 。

4

2 に答える 2

7

ネストされたリソースに関する Rails ガイドを読むことを検討してください。

http://guides.rubyonrails.org/routing.html#nested-resources

手短に:

ルート.rb

resources :galleries do
  resources :pictures do
end
# Generates the routes: /galleries/:gallery_id/pictures

pictures_controller.rb

def new
  @gallery = Gallery.find(params[:gallery_id])
  @picture = Picture.new
end
def create
  @gallery = Gallery.find(params[:gallery_id]) # gallery_id is passed in the URL
  @picture = @gallery.build(params[:picture])
  if @picture.save
  # success
  else
  # fail
  end
end

写真/new.html.erb

<%= form_for [@gallery, @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 %>

わかりました、gallery_id は引き続き URL を介して渡されますが、実際には何も問題はありません。あなたはそれをどこかに渡さなければなりませんよね?それをどこに渡すかについては、実際には 3 つの適切な選択肢しかありません。隠しフィールド、クエリ文字列パラメーターとして、または URL 内に隠れている (ネストされたリソース)。3つのうち、後者は私見で最もクリーンな方法です。

物事をさらに簡単にしたい場合は、Jose Valim の Inherited Resources gem を調べることを強くお勧めします。

https://github.com/josevalim/inherited_resources

于 2011-03-06T00:29:56.113 に答える
0

RESTful ルートで数値 ID を使用する必要はありません。permalink_fu を見て、:id ではなく :permalink フィールドを使用して、各ギャラリー リソースを参照します。

/galleries/louvre
/galleries/moma/382

... new_picture_path(:gallery_id => @gallery.permalink)

ここで重要なのは、ID ではないシンボリックで一意のキーを使用することです。パーマリンクはそのために非常に適しています。

パーマリンクを :id として渡し、それを期待するようにコントローラー アクションを更新することを選択できます。

于 2011-03-06T00:23:50.440 に答える