ruby-on-rails – Virtus:用表单对象替换accepts_nested_attrib
从一个多月以来,我试图在Rails 4中隐藏表单对象的秘密.
使用virtus,我已经能够构建非常简单的表单.但是,我无法开发一个表单对象来替换在模型中的accepts_nested_attributes_for和fields_for(在表单视图中). 在this question我解释了一个小电话簿 – 例子:表格提供了一次输入一个人的姓名和3个电话号码的可能性(找到整个代码here). 现在我尝试用表单对象做同样的事情.我得到这个: # 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 %> 这给了我错误
line:@ person.phones.build(:phone) 但我担心,这不是唯一的错误. 你能指出我用表单对象实现一对多的赋值(最好使用Virtus)吗? 解决方法
一种解决方案是在表单模型的单独函数中创建关联对象.通过以下方式我很成功:
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/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |