非模型数组元素

时间:2017-09-06 09:20:05

标签: ruby-on-rails

我有一个模型,其中包含一些非模型属性的送货地址。

其中一个要素是:

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

2 个答案:

答案 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' %>