首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Virtus:用表单对象替换accepts_nested_attributes (一对多)

Virtus:用表单对象替换accepts_nested_attributes (一对多)
EN

Stack Overflow用户
提问于 2013-09-02 20:33:05
回答 1查看 953关注 0票数 4

自从一个多月以来,我一直试图在Rails 4中隐藏表单对象的秘密。

使用维塔斯,我已经能够构建非常简单的表单。但是,我未能开发一个替代accepts_nested_attributes_for (在模型中)和fields_for (在表单视图中)的表单对象。

这个问题中,我解释了一个小电话簿-示例:表单提供了一次输入一个人的姓名和3个电话号码的可能性(查找整个代码这里)。

现在,我尝试对一个form对象执行同样的操作。我说到这里:

代码语言:javascript
复制
# 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)吗?

EN

回答 1

Stack Overflow用户

发布于 2015-01-06 14:58:17

一种解决方案是在表单模型上的一个单独函数中创建关联的对象。我成功地做了以下工作:

代码语言:javascript
复制
 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/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18580406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档