web-dev-qa-db-ja.com

accepts_nested_attributes_forはbelongs_toで動作しますか?

私はこの基本的な質問に関してあらゆる種類の相反する情報を得ており、その答えは私の現在の問題にとって非常に重要です。したがって、非常に簡単に、Rails 3では、belongs_to関係でaccepts_nested_attributes_forを使用することは許可されていますか?

class User < ActiveRecord::Base
  belongs_to :organization
  accepts_nested_attributes_for :organization
end

class Organization < ActiveRecord::Base
  has_many :users
end

ビュー内:

= form_for @user do |f|
  f.label :name, "Name"
  f.input :name

  = f.fields_for :organization do |o|
    o.label :city, "City"
    o.input :city

  f.submit "Submit"
58
Nick M

ネストされた属性は、Rails 4のように、belongs_toアソシエーションに対して正常に動作するようです。Railsの以前のバージョンで変更された可能性があります。

22
kid_drew

Doc epochwolfは、最初の行で「ネストされた属性を使用すると、関連するレコードに属性を保存できます親を介して」と述べています。 (私の強調)。

この他のSOこれと同じ行に沿った質問 に興味があるかもしれません。それは2つの可能な解決策を説明しています。1)accepts_nested_attributesを反対側に移動します関係(この場合は組織)、または2) buildメソッドを使用 フォームをレンダリングする前にユーザーに組織を構築します。

また、 belongs_to関係でaccepts_nested_attributesを使用するための潜在的な解決策 少し余分なコードを処理したい場合について説明するGistを見つけました。これもbuildメソッドを使用します。

21
robmclarty

Rails 3.2)のbelongs_toアソシエーションの場合、ネストされたモデルには次の2つの手順が必要です。

(1)新しいattr_accessibleを子モデル(ユーザーモデル)に追加します。

accepts_nested_attributes_for :organization
attr_accessible :organization_attributes

(2)organization列を作成するために、@user.build_organizationを子コントローラー(ユーザーコントローラー)に追加します。

def new
  @user = User.new
  @user.build_organization
end
10
user3551164

Ruby on Rails 5.2.1

class User < ActiveRecord::Base
  belongs_to :organization
  accepts_nested_attributes_for :organization
end

class Organization < ActiveRecord::Base
  has_many :users
end

あなたのコントローラーにたどり着いた、「users_controller.rb」であると仮定します:

Class UsersController < ApplicationController

    def new
        @user = User.new
        @user.build_organization
    end
end

そして、ニックがやったようにビュー:

= form_for @user do |f|
  f.label :name, "Name"
  f.input :name

  = f.fields_for :organization do |o|
    o.label :city, "City"
    o.input :city

  f.submit "Submit"

最後に、@ user3551164がすでに解決していることがわかりますが、今(Ruby on Rails 5.2.1)attr_accessible :organization_attributesは不要です)

4
Fábio Araújo