我有一个模型,其中包含一些非模型属性的送货地址。
其中一个要素是:
<%= form_for Checkout.new, url: placeorder_url do |f| %>
<%= f.text_field "shipping[firstname]", value: nil, class: 'form-control', placeholder: 'First Name' %>
<% end %>
输出
<input value="" class="form-control" placeholder="First Name" type="text" name="checkout[shipping[firstname]]" id="checkout_shipping[firstname]">
但是当在模型中添加相同的验证时,我需要先将其添加到 attr_accessor ,这是我无法做到的。模型名称是Checkout,这就是输出html中结帐的原因。
模型是:
class Checkout
include ActiveModel::Model
attr_accessor :shipping
validates "shipping[firstname]", presence: true
end
发布的数据如下:
{"checkout"=>
{"shipping"=>
{
"firstname"=>"", "lastname"=>"", "companyname"=>"", "address1"=>"", "address2"=>"", "city"=>"", "state"=>"", "postalcode"=>"", "primaryphone"=>"", "secondaryphone"=>""
}
}
}
是否有人知道如何允许attr_accessor的自定义数组字段或任何其他方式来验证它们。
我得到的错误是:
undefined method `shipping[firstname]' for #<Checkout:0x00000001789de8>
答案 0 :(得分:0)
您的姓名必须是结帐[发货] [名字],而不是结帐[发货[名字]],如评论中所述。 解决这个问题的一种方法是:
<%= form_for Checkout.new, url: placeorder_url do |f| %>
<%= f.text_field "shipping[firstname]", name: "checkout[shipping][firstname]", value: nil, class: 'form-control', placeholder: 'First Name' %>
<% end %>
答案 1 :(得分:0)
为名字添加attr_accessor
class Checkout
include ActiveModel::Model
attr_accessor :firstname
end
然后你可以将它用作属性。利用name
生成正确的元素名称
<%= f.text_field :firstname, value: nil,name: 'checkout[shipping][firstname]', class: 'form-control', placeholder: 'First Name' %>