2

私はRailsにかなり慣れていません。このコードは機能していますが、Railsの魔法の一部を実行できていないと思います:

ゴール: を作成し、テーブル内のメソッドと関連付けcauseを介して作成者をメンバーにします。buildhas_many :throughCause_User_Membership

質問: をcause作成してからメンバーシップを「手動で」作成することで、機能するようになりました。Cause_User_Membershipの作成時に関係を自動的に作成する方法はありcauseますか?

Cause_Controller.rb

def create
@cause = current_user.causes.build(params[:cause].merge :created_by => current_user.id)

respond_to do |format|
  if @cause.save 
    @membership = current_user.cause_user_memberships.build(:cause_id => @cause.id)
    @membership.save
    format.json { render :json => {current_user: current_user, results: @cause}}
  else
    format.json { render :json => {Message: "You messed up"}}
  end
end
end

User.rb (スニペット)

has_many :cause_user_memberships
has_many :causes, :through => :cause_user_memberships

コーズ.rb

attr_accessible :title, :location, :description,...
has_many :cause_user_memberships
has_many :users, :through => :cause_user_memberships

Cause_User_Membership.rb (<--おそらく私の最高のモデル名ではありません)

    # == Schema Information
#
# Table name: cause_user_memberships
#
#  id         :integer          not null, primary key
#  user_id    :integer          not null
#  cause_id   :integer          not null
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class CauseUserMembership < ActiveRecord::Base
  attr_accessible :cause_id, :user_id

  belongs_to :user #, :class_name => "User", :foreign_key => "user_id" 
  belongs_to :cause #, :class_name => "Cause", :foreign_key => "cause_id"

end
4

1 に答える 1

2

アップデート:

を使用して、これを行うためのもう少し「魔法の」方法を見つけましたaccepts_nested_attributes_forCauseUserMembershipまず、モデルに行を追加します。

class CauseUserMembership < ActiveRecord::Base
  attr_accessible :cause_id, :user_id

  belongs_to :user
  belongs_to :cause 

  accepts_nested_attributes_for :cause

その変更により、これを行うことができます:

def create
  @membership = current_user.memberships.build
  @membership.cause = Cause.new(params[:cause].merge(:created_by => current_user.id)

  respond_to do |format|
    if @membership.save
      ...

Rails にcause関連付けのネストされた属性を受け入れるように指示したため、メンバーシップ自体を保存CauseUserMembershipするときに、割り当てた新しい原因が保存されます。@membership.causeそのため、原因と会員記録の両方を別々に保存するのではなく、一度に保存できます。

元の答え:

あなたがしたことは、これを行うためのかなり正しい方法だと思います。少し単純化できます: からビルドする必要はなくcausecurrent_userそのまま使用できますnew( と の関連:through付けは の作成時に設定されます)。causecurrent_user@membership

このように(私は の最初の行だけを変更しましたcreate):

def create
  @cause = Cause.new(params[:cause].merge(:created_by => current_user.id))

  respond_to do |format|
    if @cause.save
      @membership = current_user.cause_user_memberships.build(:cause_id => @cause.id)
      @membership.save
      ...

関連項目:関連付けによる多対多 Rails アプリでのプロパティのビルド/作成

于 2012-11-29T00:09:09.410 に答える