1

ユーザーとプロモーションの 2 つのモデルがあります。ユーザーは has_many プロモーションを作成でき、プロモーションはユーザーに属します。

プロモーション.rb

class Promotion < ActiveRecord::Base
belongs_to :user
belongs_to :good

validates :name,  :presence => true
validates :title, :presence => true
validates :description, :presence => true


end

私が考案したユーザーのために:

user.rb

class User < ActiveRecord::Base

has_many :promotions  ,:foreign_key => "user_id",
   :dependent => :destroy



devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable,
     :omniauthable, :omniauth_providers => [:facebook]
# Setup accessible (or protected) attributes for your model
 attr_accessible :email, :password, :password_confirmation, :remember_me,:provider,:uid,:address,:name,:surname,:supplier,:partita_iva,:state,
              :gender ,:language,:bio,:work,:education

今、新しいプロモーションを作成したいときにこのエラーが発生します

PromotionsController の NoMethodError#nil:NilClass の未定義メソッド「promotions」を作成

これはコントローラーです:

 def create
@user = User.find_by_id(params[:user_id])
@promotion =@user.promotions.create(:params[:promotion])
redirect_to promotion_patch(@promotion)

respond_to do |format|
  if @promotion.save
    format.html { redirect_to @promotion, notice: 'Promotion was successfully created.' }
    format.json { render json: @promotion, status: :created, location: @promotion }
  else
    format.html { render action: "new" }
    format.json { render json: @promotion.errors, status: :unprocessable_entity }
  end
end
end

助けてください :)

4

1 に答える 1

1

params[:user_id] に有効なユーザー ID が含まれていないようです。find の代わりに find_by_id を使用したため、静かに nil が @user に割り当てられました。もちろん、nil には #promotions という名前のメソッドがないため、その行は失敗しました。

@user が nil であることを確認するか、User.find_by_id を User.find に変更してから、ActiveRecord::RecordNotFound をレスキューする必要があります。いずれの場合も、カスタム 404 またはその他の適切な方法で応答してください。

もう 1 つ質問があります。ユーザーが他のユーザーのためにプロモーションを作成できるという意図はありますか? 彼らが自分たちのためだけにプロモーションを作成する必要がある場合は、 User.find_by_id 行全体を削除し、次の行を次のように変更するだけで、この混乱全体を回避できます。

@promotion = current_user.promotions.create(params[:promotion])

Devise にはすでに current_user があるはずです。いずれの場合も、ユーザー指定のパラメーターに検証エラーがあるためにプロモーションを作成できない場合にどうなるかを処理する必要があります。

于 2013-05-14T21:08:49.663 に答える