我有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
使用fields_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个调试行是我的问题所在,但它首先与第三行有关。在那里,我试图为下拉选择字段提供一个"预选"值。这样当用户编辑RegistryItem时,他们之前选择的AttrName就会显示出来。
我试图使用f.object.attr_name_id
来设置该值,但它实际上并没有正确选择先前选择的值,而是只到第1个。
前两个调试行,然后我试图确保我的f.object
方法工作…
当我查看日志时,我看到如下内容:
object type is: #<ItemAttrVal:0x007fb3ba2bd980>
some details are: --
基本上,第一行显示我正在获取ItemAttrVal第二行似乎没有为它检索任何信息。
我还使用了调试器来检查,在那里,我能够使用display f.object.attr_name_id
向我显示我期望的确切值…
这可以归结为两个问题……
- 为什么不能检索
f.object
的值 - 我是否试图做第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" %>
)错误,实际上有更好的方法来做到这一点?
提前感谢!
你需要使用params[:attr_name_id]到你的options_from_collection_for_select
<%= f.select :attr_name_id, options_from_collection_for_select(AttrName.all,"id","description", params[:attr_name_id].to_i), :prompt => "Select an attribute" %>
希望有所帮助
原来我把: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的值打印出来,但至少原来的问题被解决了。