fields_for builder .object方法不允许我检索对象值

时间:2013-03-16 14:17:29

标签: ruby-on-rails fields-for

我有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个调试行是我的问题所在,但它首先涉及第3行。 在那里,我试图为下拉选择字段提供“预先选择”的值。这样,当用户编辑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向我展示我期待的确切值......

这种问题归结为两个问题......

  1. 为什么我无法检索f.object
  2. 的值
  3. 我是否尝试将第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 个答案:

答案 0 :(得分: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" %>

希望有所帮助

答案 1 :(得分: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的值,但至少解决了原始原始问题。