加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Virtus:用表单对象替换accepts_nested_attrib

发布时间:2020-12-17 02:05:11 所属栏目:百科 来源:网络整理
导读:从一个多月以来,我试图在Rails 4中隐藏表单对象的秘密. 使用virtus,我已经能够构建非常简单的表单.但是,我无法开发一个表单对象来替换在模型中的accepts_nested_attributes_for和fields_for(在表单视图中). 在this question我解释了一个小电话簿 – 例子:表
从一个多月以来,我试图在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 %>

这给了我错误

undefined method `stringify_keys’ for :phone:Symbol

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/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读