質問

Rails ビューでネストされたフォームを生成できないようです。 belongs_to 新しいものを使った関係 accepts_nested_attributes_for Rails 2.3の機能。利用可能なリソースの多くをチェックアウトしましたが、私のコードと似ています すべき 仕事してるけど、 fields_for が爆発的に発生しました。これは、ネストされたモデルの構成方法に関係があるのではないかと思います。

私が遭遇したエラーは、さまざまな原因が考えられる一般的なエラーです。

'@account[owner]' is not allowed as an instance variable name

関連する 2 つのモデルは次のとおりです。

class Account < ActiveRecord::Base
  # Relationships
  belongs_to :owner, :class_name => 'User', :foreign_key => 'owner_id'
  accepts_nested_attributes_for :owner
  has_many :users
end

class User < ActiveRecord::Base
  belongs_to :account
end

おそらく、これは私が「正しく」やっているところです。アカウントには「所有者」があり、「ユーザー」を持つこともできますが、ユーザーモデルの account_id キーに基づいて、ユーザーは「アカウント」を 1 つしか持たないからです。

これは私にとって衝撃的な new.html.haml のビュー コードです。

- form_for :account, :url => account_path do |account|
  = account.text_field :name
  - account.fields_for :owner do |owner|
    = owner.text_field :name

これは新しいアクションのコントローラー コードです。

class AccountsController < ApplicationController
  # GET /account/new
  def new
    @account  = Account.new
  end
end

/account/new をロードしようとすると、次の例外が発生します。

NameError in Accounts#new
Showing app/views/accounts/new.html.haml where line #63 raised:
@account[owner] is not allowed as an instance variable name

謎の 'build' メソッドを使用しようとすると、コントローラー内で爆発するだけです。おそらく、build は複数のレコードの関係だけを対象としているためです。

class AccountsController < ApplicationController
  # GET /account/new
  def new
    @account  = Account.new
    @account.owner.build
  end
end

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.build

コントローラーで @account.owner_attributes = {} または @account.owner = User.new を使用してこれを設定しようとすると、「@account[owner] はインスタンスとして許可されていません」という元のエラーに戻ります。変数名」。

他にbelongs_to関係を扱う新しいaccepts_nested_attributes_forメソッドを持っている人はいますか?何か特別なことや違うことをしなければならないことはありますか?すべての公式サンプルとサンプル コード ( ライアンズ・スクラップスで素晴らしいことが起きた) は複数レコードの関連付けに関係します。

役に立ちましたか?

解決

あなたのことだと思います accepts_nested_attributes 関係の間違った側にいます。おそらくこのようなものがうまくいくでしょうか?

class Account < ActiveRecord::Base
  belongs_to :owner, :class_name => 'User', :foreign_key => 'owner_id'
  has_many :users
end

class User < ActiveRecord::Base
  belongs_to :account
  has_one :account, :foreign_key => :owner_id
  accepts_nested_attributes_for :account
end

アカウントを構築するには、build_account を使用します。

さらに多くの例を参照できます。 ドキュメント.

他のヒント

数か月遅れていますが、このエラーを解決しようとしていましたが、私の状況は「反対側を向く」ように関係を変えることができないということでした。

答えは実に簡単です。新しいアクションでこれを行う必要があります。

@account.build_owner

field_for を使用してフォームが表示されなかった理由は、フォームに有効なオブジェクトがなかったためです。あなたはそこに正しいアイデアを持っていました:

@account.owner.build

ただし、これは方法ではありません belongs_to 仕事。このメソッドは次の場合にのみ生成されます。 has_many そして has_and_belongs_to_many.

参照:http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference

私はRails 2.3.5を使用していますが、同じことに気づきました。active_record のnested_attributes.rb のソースを確認すると、belongs_to は正常に動作するようです。したがって、「ネストされたフォーム」のバグである可能性があるようです。

私はあなたとまったく同じような入れ子になったフォームを持っています。 User belongs_to :address, 、 そして Address ユーザーから独立しています。

次に、フォームで次のようにします <% f.fields_for :address_attributes do |address_form| %> の代わりに <% f.fields_for :address do |address_form| %>. 。より良い方法が見つかるまでの一時的なハックですが、これは機能します。方法 accepts_nested_attributes_for パラメータに次のようなものが含まれることを期待しています。

{user=>{address_attributes=>{attr1=>'one',attr2=>'two'}, name=>'myname'}

...しかし fields_for 生産しています:

{user=>{address=>{attr1=>'one',attr2=>'two'}, name=>'myname'}

こうすれば追加する必要がなくなります has_one :account あなたのコードに追加しますが、私の場合は機能しません。

アップデート:より良い答えが見つかりました:

これを正しく機能させるために使用しているコードの要点は次のとおりです。

Rails のbelongs_to Gist を使用したネストされたフォーム

それが役立つことを願っています。

class Account < ActiveRecord::Base

    belongs_to :owner  :class_name => 'User', :foreign_key => 'owner_id'
end

わたしにはできる。:foreign_key => 'owner_id' が私の場合の重要な問題でした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top