我正在创建一个嵌套表单,其中包含来自不同模型的属性。在保存新对象之前,我希望所有必需的属性都是有效的。
<%= form for @product do |f| %>
<%= f.fields_for @customer do |g| %>
<%= g.label :name %>
<%= g.text_field :name %>
<%= g.label :email %>
<%= g.text_field :email %>
<%= g.label :city %>
<%= g.text_field :city %>
<%= g.label :state %>
<%= g.text_field :state %>
<%= g.label :zipcode %>
<%= g.text_field :zipcode %>
<% end %>
<%= f.label :product %>
<%= f.text_field :product %>
<%= f.label :quantity %>
<%= number_field(:quantity, in 1..10) %>
<% end %>
这是我的模型
class Product < ActiveRecord::Base
belongs_to :customer
validates_associated :customer
validates :product, :presence => "true"
end
class Customer < ActiveRecord::Base
has_one :product
validates :name, :email, presence: true
validates :email, format: { with: /[A-Za-z\d+][@][A-Za-z\d+][.][A-Za-z]{2,20}\z/ }
validates :city, presence: true
validates :zipcode, format: { with: /\A\d{5}\z/ }
end
我在我的产品模型中添加了
validates_associated
,所以我的@product
表单需要通过所有的客户验证。这意味着姓名、电子邮件、城市和zipcode必须存在,并且必须正确格式化。我胡乱摆弄,没有填写客户要求的字段就提交了表单,表单被认为是有效的。
我不明白我的错误在哪里。
编辑
好的,通过添加
validates :customer
,客户属性现在是必需的。但它们实际上并没有保存到数据库中。我想这和我的情妇有关def product_params
params.require(:product).permit(:product, :quantity)
end
是否需要将我的客户参数添加到允许的参数列表中?
最佳答案
试试这个:
在控制器中,创建产品和关联客户的实例,如下所示:
@product = Product.new
@customer = @product.build_customer
表单使用此代码
<%= form for @product do |f| %>
<%= f.fields_for :customer do |g| %>
<%= g.label :name %>
<%= g.text_field :name %>
<%= g.label :email %>
<%= g.text_field :email %>
<%= g.label :city %>
<%= g.text_field :city %>
<%= g.label :state %>
<%= g.text_field :state %>
<%= g.label :zipcode %>
<%= g.text_field :zipcode %>
<% end %>
<%= f.label :product %>
<%= f.text_field :product %>
<%= f.label :quantity %>
<%= number_field(:quantity, in 1..10) %>
<% end %>
即使用:customer符号代替@customer实例变量。
在产品模型中使用accepts_nested_attributes_作为helper方法,正如@charles所说