自从一个多月以来,我一直试图在Rails 4中隐藏表单对象的秘密。
使用维塔斯,我已经能够构建非常简单的表单。但是,我未能开发一个替代accepts_nested_attributes_for (在模型中)和fields_for (在表单视图中)的表单对象。
在这个问题中,我解释了一个小电话簿-示例:表单提供了一次输入一个人的姓名和3个电话号码的可能性(查找整个代码这里)。
现在,我尝试对一个form对象执行同样的操作。我说到这里:
# 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 %>这给了我错误
未定义方法`stringify_keys‘for :phone:符号
线:@person.phones.build(:phone)
不过,我恐怕这并不是唯一的错误。
你能告诉我如何使用表单对象来实现一对多的任务(更适合使用Virtus)吗?
发布于 2015-01-06 14:58:17
一种解决方案是在表单模型上的一个单独函数中创建关联的对象。我成功地做了以下工作:
def persist!
@user.save!
@account.save!
create_admin_membership
end
def create_admin_membership
@membership = Membership.create! do |membership|
membership.user = @user
membership.account = @account
membership.admin = true
end
end您可以在这里找到一个扩展的解释:http://w3facility.org/question/how-to-create-another-object-when-creating-a-devise-user-from-their-registration-form-in-rails/
https://stackoverflow.com/questions/18580406
复制相似问题