19

私はレールに比較的慣れていないので、最終的に正しい使用方法を見つけましたaccepts_nested_attributes_for

ただし、ウェブ上には、使用accepts_nested_attributes_forは一般的に悪い習慣であると言う深刻なリソースがいくつかあります (このような)

回避するために必要な変更accepts_nested_attributes_forと、追加のクラスファイルを配置するフォルダー (追加のクラスが必要だと思います)。

美徳はそれにふさわしいと読みました。そうですか?

これはまだ使用している非常に基本的な例ですaccepts_nested_attributes_for(完全な例はこちらにあります):

モデル

class Person < ActiveRecord::Base

    has_many :phones
    accepts_nested_attributes_for :phones

end

class Phone < ActiveRecord::Base

    belongs_to :person

end

コントローラ

class PeopleController < ApplicationController

    def new

        @person = Person.new
        @person.phones.new

    end

    def create

        @person = Person.new(person_params)
        @person.save

        redirect_to people_path

    end

    def index

        @people = Person.all

    end

private

    def person_params

        params.require(:person).permit(:name, phones_attributes: [ :id, :number ])

    end

end

見る (people/new.html.erb)

<%= form_for @person, do |f| %>
    <p>
        <%= f.label :name %><br />
        <%= f.text_field :name %>
    </p>
    <%= f.fields_for :phones do |builder| %>
    <p>
            <%= builder.label :number %><br />
            <%= builder.text_field :number %>
    </p>
    <% end %>
    <%= f.submit %>
<% end %>

[編集]
サービス オブジェクトを使用するのは良い考えでしょうか?

4

4 に答える 4

5

したがって、受け入れられた答えは、なぜaccepts_nested_attributes_forがしばしば良い解決策であるかを述べているだけですが、実際にそれを行う方法についての解決策を提供することは決してありません. リンクされた記事の例では、ネストされたオブジェクトの動的な数をフォームに受け入れさせたい場合に問題が発生します。これが私が見つけた唯一の解決策です

https://coderwall.com/p/kvsbfa/nested-forms-with-activemodel-model-objects

後世のために、これは基本ですが、サイトにはもう少しあります。

class ContactListForm
include ActiveModel::Model

attr_accessor :contacts

def contacts_attributes=(attributes)
  @contacts ||= []
  attributes.each do |i, contact_params|
    @contacts.push(Contact.new(contact_params))
  end
end
end

class ContactsController < ApplicationController
   def new
      @contact_list = ContactListForm.new(contacts: [Contact.new])
    end
  end

リレーションシップのf.fields_for :contactsように動作has_manyし、フォーム オブジェクトで簡単に処理する必要があります。

Contactモデルでない場合は、ARなりすましも必要になりますpersisted?

于 2016-05-08T03:49:21.560 に答える
-3

Railscasts には、ネストされたフォーム モデルに関するエピソードもあります: http://railscasts.com/episodes/196-nested-model-form-revised?view=asciicast

コメントに示されているように、cocoon gem は非常に単純化されています: https://github.com/nathanvda/cocoon

于 2013-07-14T10:32:34.207 に答える