1

アカウント、ユーザー、連絡先の 3 つのモデルがあります。

class User < ActiveRecord::Base
  has_one :account

  has_many :contacts, :through => :account
end

class Account < ActiveRecord::Base
  belongs_to :owner, :class_name => 'User'

  has_many :contacts
end

class Contact < ActiveRecord::Base
  belongs_to :account
end

連絡先コントローラーでこのように、ユーザー レコードを使用して新しい連絡先を構築しようとしています。

def create
    @contact = current_user.contacts.build(params[:contact])

    respond_to do |format|
      if @contact.save
        ...
      else
        ...
      end
    end
end

これを行うと、エラーは発生しません。連絡先レコードはデータベースに保存されますが、連絡先に account_id 列が設定されず、コレクションに追加されないため、@ current_user.contacts を呼び出すと空のコレクションが返されます.

助言がありますか?

4

1 に答える 1

0

を使用すると、メモリ内に Contact の新しいインスタンスが作成されますが、レコードbuildに手動で設定する必要があります(例: )。または、作成する連絡先を表示するために使用されるフォームの隠しフィールドに設定してメソッドに渡される params 配列。account_id@contact.account_id = current_user.account.idnewbuild

accepts_nested_attributes_forこの場合に役立つかどうかを検討することもできます。別のオプションとして を使用することもできますdelegateが、どちらの場合も、これらの目的 (通常は「親」で定義) とは逆の使用になる可能性があります。

更新:あなたの場合、buildユーザーと連絡先の間に多対多の関係と1対の関係があるため、メソッドはユーザーインスタンスとアカウント(おそらく「所有者」)インスタンスの両方に追加されます-アカウントと連絡先の間の多くの関係。したがって、取得するaccount_idには、次のようにアカウントのビルドを呼び出す必要があると思います

@contact = current_user.accounts.contacts.build(params[:contact])

これは機能しますか?

于 2012-11-30T14:35:40.220 に答える