0

has-many-through 関連付けを構成する 3 つのモデルがあります。

モデル コードは次のとおりです。

ItemAttrValモデル(遷移表)

class ItemAttrVal < ActiveRecord::Base
  belongs_to :attr_name
  belongs_to :registry_item
end

RegistryItemモデル

class RegistryItem < ActiveRecord::Base
  has_many :item_attr_vals
  has_many :attr_names, :through => :item_attr_vals
  accepts_nested_attributes_for :item_attr_vals, :allow_destroy => :true
end

AttrNameモデル

class AttrName < ActiveRecord::Base
  has_many :item_attr_vals
  has_many :registry_items, :through => :item_attr_vals
end

RegistryItemは afields_forを次のように使用します。

<%= item.fields_for :item_attr_vals do |iav| %>
    <%= render 'item_attr_val_fields', :f => iav %>
<% end %>

部分的には、次のようになります。

<% logger.debug "object type is: #{f.object}"%>
<% logger.debug "some details are: #{f.object.attr_name_id}--"%>
<%= f.select :attr_name_id, options_from_collection_for_select(AttrName.all,"id","description"), :selected => f.object.attr_name_id, :prompt => "Select an attribute" %>
<%= f.text_field :raw_value %> <br />

最初の 2 つのデバッグ行は私の質問のビットですが、最初に 3 行目に関連しています。そこで、ドロップダウン選択フィールドに「事前に選択された」値を提供しようとしています。これは、ユーザーが RegistryItem を編集しているときに、以前に選択した AttrName が表示されるようにするためです。

を使用してその値を設定しようとしてf.object.attr_name_idいますが、実際には以前に選択した値を適切に選択せず、代わりに最初に移動します。

最初の 2 つのデバッグ行は、メソッドが機能することを確認するためのものでしたf.object...

ログを見ると、次のように表示されます。

object type is: #<ItemAttrVal:0x007fb3ba2bd980>
some details are: --

基本的に、1 行目は、ItemAttrVal を取得していることを示しています。2 行目は、その情報を取得していないようです。

また、デバッガーを使用してチェックしましたが、そこで、display f.object.attr_name_id期待している正確な値を表示するために使用できます...

この種の質問は2つにまとめられます...

  1. の値を取得できないのはなぜf.objectですか?
  2. 行 3 ( ) を間違って実行しようとし<%= f.select :attr_name_id, options_from_collection_for_select(AttrName.all,"id","description"), :selected => f.object.attr_name_id, :prompt => "Select an attribute" %>ているのですか?実際にはもっと良い方法がありますか?

前もって感謝します!

4

2 に答える 2

0

options_from_collection_for_select に params[:attr_name_id] を使用する必要があります

<%= f.select :attr_name_id, options_from_collection_for_select(AttrName.all,"id","description", params[:attr_name_id].to_i), :prompt => "Select an attribute" %>

それが役に立てば幸い

于 2013-03-16T15:10:38.073 に答える
0

:selected間違った場所に置いていたことが判明しました...

オリジナル:

<%= f.select :attr_name_id, options_from_collection_for_select(AttrName.all,"id","description"), :selected => f.object.attr_name_id, :prompt => "Select an attribute" %>

次のようにする必要があります。

<%= f.select :attr_name_id, options_from_collection_for_select(AttrName.all,"id","description", f.object.attr_name_id), :prompt => "Select an attribute" %>

私の問題を解決した修正により、以前に保存された属性の属性名が期待どおりに表示されるようになりました。

f.object の値を出力できない理由についての元の質問にはまだ答えていませんが、少なくとも元の元の問題は解決されました。

于 2013-03-16T15:48:19.000 に答える