使用virtus,我已经能够构建非常简单的表单.但是,我无法开发一个表单对象来替换在模型中的accepts_nested_attributes_for和fIElds_for(在表单视图中).
在this question我解释了一个小电话簿 – 例子:表格提供了一次输入一个人的姓名和3个电话号码的可能性(找到整个代码here).
现在我尝试用表单对象做同样的事情.我得到这个:
# forms/person_form_new.rbclass 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 endprivate def persist @person = Person.create(name: person_name) @person.phones.build(:phone) endend# 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 %>
这给了我错误
undefined method `stringify_keys’ for :phone:Symbol
line:@ person.phones.build(:phone)
但我担心,这不是唯一的错误.
你能指出我用表单对象实现一对多的赋值(最好使用Virtus)吗?
解决方法 一种解决方案是在表单模型的单独函数中创建关联对象.通过以下方式我很成功:def persist! @user.save! @account.save! create_admin_membershipenddef create_admin_membership @membership = Membership.create! do |membership| membership.user = @user membership.account = @account membership.admin = true endend
您可以在此处找到扩展说明:http://w3facility.org/question/how-to-create-another-object-when-creating-a-devise-user-from-their-registration-form-in-rails/
总结以上是内存溢出为你收集整理的ruby-on-rails – Virtus:用表单对象替换accepts_nested_attributes(一对多)全部内容,希望文章能够帮你解决ruby-on-rails – Virtus:用表单对象替换accepts_nested_attributes(一对多)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)