4

1 か月以上前から、Rails 4 のフォーム オブジェクトの秘密を探ろうとしています。

virtusを使用して、非常に単純なフォームを作成することができます。accepts_nested_attributes_forただし、 (モデル内) とfields_for(フォーム ビュー内)を置き換えるフォーム オブジェクトの開発に失敗しました。

この質問では、小さな電話帳の例について説明します。このフォームでは、人の名前と 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 %>

これは私にエラーを与えます

:phone:Symbol の未定義のメソッド `stringify_keys'

ライン:@person.phones.build(:phone)

残念ながら、これが唯一のエラーではありません。

フォーム オブジェクトで 1 対多の割り当てを実現する方法を教えてもらえますか (Virtus を使用するのが望ましい)。

4

1 に答える 1