如果我的模型具有以下关联:
class Business
has_many :products
class Product
belongs_to :business
我在控制器中生成了3个产品:
def new
@business = Business.new
3.times do
@business.products.build
end
end
让我的表单看起来像这样:
<%= form_for @business do |f| %>
<% f.text_field :business_name %>
<%= f.fields_for :products do |pf| %> # x2 more products generated
<% pf.text_field :name %>
<% pf.text_field :price %>
<% pf.text_field :date %>
<% end %>
如果我希望其中一个字段充当其他产品的全局字段,我怎样才能使用:price
这样的字段并将其放在f.fields_for :products
之外的字段中所有产品的:price
?
谢谢。
答案 0 :(得分:3)
如果您需要初始化价格,请在控制器中执行此操作。但是,如果您需要一个不直接映射到模型的字段,请使用常规表单助手:
<%= text_field_tag 'global_price' %>
然后在创建操作的控制器中,它可用作
params[:global_price]
或者,您可以在商业模式中定义一种方法:
def global_price=
#do something with the global price, such as updating child object...
# I'm not sure if the child form objects have been instantiated yet though
end
然后您可以在商家表单中使用它:
<%= f.text_field :global_price %>
如果需要更新子对象,则可能需要在以后执行此操作;而不是那个方法,让它
attr_accessor :global_price
这使它成为一个实例变量。然后,您可以使用before_save过滤器来更新子对象。
before_save :update_global_price
def update_global_price
#do something with @global_price
end