一个多月以来,我试图了解 Rails 4 中表单对象的秘密。
使用virtus,我已经能够构建非常简单的表单。但是,我无法开发替换accepts_nested_attributes_for
(在模型中)和fields_for
(在表单视图中)的表单对象。
在这个问题中,我解释了一个小的电话簿示例:该表格提供了一次输入一个人的姓名和 3 个电话号码的可能性(在此处找到整个代码)。
现在我尝试对表单对象做同样的事情。我到此为止:
# forms/person_form_new.rb
class PersonFormNew
class PhoneFormNew
include Virtus
include ActiveModel::Model
attr_reader :phone
attribute :phone_number, String
end
include Virtus
include ActiveModel::Model
attr_reader :person
attribute :person_name, String
attribute :phone, PhoneFormNew
def persisted?
false
end
def save
if valid?
persist
true
else
false
end
end
private
def persist
@person = Person.create(name: person_name)
@person.phones.build(:phone)
end
end
# views/people/new.html.erb
<h1>New Person</h1>
<%= form_for @person_form, url: people_path do |f| %>
<p>
<%= f.label :person_name %> </ br>
<%= f.text_field :person_name %>
</p>
<p>
<%= f.fields_for :phone do |f_pho| %>
<%= f_pho.label :phone_number %> </ br>
<%= f_pho.text_field :phone_number %>
<% end %>
<p>
<%= f.submit %>
</p>
<% end %>
这给了我错误
:phone:Symbol 的未定义方法“stringify_keys”
线:@person.phones.build(:phone)
然而,我担心,这不是唯一的错误。
你能告诉我用表单对象实现一对多赋值的方法吗(最好使用 Virtus)?