Ruby on rails Virtus:Replace使用表单对象接受嵌套的属性(一对多)

Ruby on rails Virtus:Replace使用表单对象接受嵌套的属性(一对多),ruby-on-rails,forms,design-patterns,object,Ruby On Rails,Forms,Design Patterns,Object,一个多月以来,我一直试图了解Rails 4中表单对象的秘密 使用,我已经能够构建非常简单的表单。但是,我无法开发一个表单对象来替换接受(在模型中)的嵌套属性和(在表单视图中)的字段 在本文中,我解释了一个小的电话簿示例:表单提供了一次输入一个人的姓名和3个电话号码(查找完整代码)的可能性 现在,我尝试对表单对象执行相同的操作。我做到了这一点: # forms/person_form_new.rb class PersonFormNew class PhoneFormNew

一个多月以来,我一直试图了解Rails 4中表单对象的秘密

使用,我已经能够构建非常简单的表单。但是,我无法开发一个表单对象来替换
接受
(在模型中)的嵌套属性和(在表单视图中)的
字段

在本文中,我解释了一个小的电话簿示例:表单提供了一次输入一个人的姓名和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 %>
\forms/person\u form\u new.rb
类PersonFormNew
类PhoneFormNew
包括病毒
包括ActiveModel::Model
属性读取器:电话
属性:电话号码,字符串
结束
包括病毒
包括ActiveModel::Model
属性读取器:个人
属性:人名,字符串
属性:phone,PhoneFormNew
def持续存在?
假的
结束
def保存
如果有效?
坚持
真的
其他的
假的
结束
结束
私有的
def持久
@person=person.create(名称:person\u name)
@person.phones.build(:phone)
结束
结束
#views/people/new.html.erb
新人

这给了我一个错误

未定义的方法“stringify_keys”用于:phone:Symbol

行:
@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
您可以在这里找到一个扩展的解释:

我不再使用virtus(甚至切换到django),因此我无法验证您的答案。。。如果你认为这是一个好的答案,我最终愿意接受你的答案而不加验证。。。