我有一个产品和类别表。类别has_many
产品和产品belongs_to
类别
当我在控制台沙箱中工作时,我可以通过以下方式轻松获得产品所属的类别:
@p = Product.find(29)
@p.category
但是,在产品的编辑页面中,我无法获得它所属的类别。
<% form_for :product, @products do |p| %>
<%= p.error_messages %>
<td><%=label "category", "Category"%></td>
<td><%=p.select :category_id, options_for_select(
@categories.map {|s| [s.name, s.id]},
["#{p.category.id}"])%></td>
所以基本上我正在尝试为包含所有类别的下拉列表的产品编辑页面,但我希望预先选择当前类别。
我得到的错误是:
undefined method `category' for #<ActionView::Helpers::FormBuilder:0xbb35f64>
答案 0 :(得分:11)
p
包含表单构建器对象,而不是模型实例。要访问模型实例,请执行以下操作:
... ["#{p.object.category.id}"])%></td>
注意“对象”。
说明 p
在form_for
的区块范围内不您的产品,因此不类型为#<Product>
。相反,它是#<ActionView::Helpers::FormBuilder:0xbb35f64>
,因为错误消息告诉您。因此,它对您的模型的属性一无所知。 FormBuilder
将您的表单对象保存在其object
方法中。
FormBuilder拥有其他可能有用的很酷的工具。我建议你做一个<%= debug p %>
来了解更多信息。