我正在创建一个嵌套表单,其中包含来自不同模型的属性。在保存新对象之前,我希望所有必需的属性都是有效的。

<%= 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所说

10-07 14:13
查看更多