2

連絡先と記事の 2 つの独立した「コンポーネント」モデルがあります。連絡先にはさまざまな種類があります (生産者、輸出者など)。

新しい記事フォームには、連絡先 (ID とタイトル) を含むドロップダウン セレクターがあり、選択した値とテキストを記事テーブルに保存したいと考えています。

新しい記事フォーム ビュー:

<%= f.select :producer_id, options_for_select(producers, @article.producer_id) %>

それproducer_idは機能し、article テーブルに格納されます。

それは私にとって明確で論理的ですが、場合によっては、選択した連絡先の役職を に保存する必要もありproducer_titleます。

「保存前にモデルで実行する」、「コントローラーで実行する」など、さまざまなオプションを読みましたが、コントローラー内で実行しました。

記事のコントローラー (更新の一部のみ):

#cont_name is producer title from Contacts
def update
  params[:article][:producer_title] = Contact.where(id: params[:article][:producer_id]).pluck(:cont_name).first 
end

これは機能しますが、この問題に対するベストプラクティスのアプローチですか?

params[producer_id]また、使用する部分を変更すると動作しないのはなぜid: params[:producer_id]ですか?

よろしくお願いします。

4

1 に答える 1

0

代わりに次のようなものはどうでしょう。

def edit
  @article = Article.find(params[:id])
  @producers = Contact.where(type: "producer") # or however you distinguish between producers and other contacts
end

次に、フォームで次のように変更します。

f.select :producer_id, options_from_collection_for_select(@producers, "cont_name")
# you might need to do (@producers, "cont_name", "cont_name"), can't quite remember

次に、更新アクションがはるかに簡単になります。

def update
  @article = Article.find(params[:id])
  if @article.update_attributes(params[:article])
    ...
  else
    ...
  end
end

:id => params[:producer_id]機能しない理由paramsは、ネストされたハッシュであるため、次のようになります。

params = { :article => { :producer_id => 34, :title => "Cool Article" }, :another_key => { :key => :value } }

したがって、 にアクセスするには、最初にハッシュproducer_idを取得する必要があります。そうしないと、上記の例ではとを含み、 を含まない最初のキー セットのみが検索されます。articlearticleanother_keyproducer_id

于 2013-04-13T04:08:08.703 に答える