1

我有两个模型用户和促销,用户可以创建 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

对于我使用的用户这样设计:

用户.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#create undefined method `promotions' for nil:NilClass

这是控制器:

 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_by_id 而不是 find,它悄悄地将 nil 分配给 @user,当然 nil 没有名为#promotions 的方法,因此该行失败。

您需要检查 @user 是否为零,或者将 User.find_by_id 更改为 User.find,然后救援 ActiveRecord::RecordNotFound。无论哪种情况,都应使用自定义 404 或任何其他看起来合适的方式进行响应。

另一个问题,您是否打算让用户为任何其他用户创建促销活动?如果他们应该只为自己创建促销活动,您可以通过删除整个 User.find_by_id 行并将下一行更改为:

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

设计应该已经为您提供了 current_user 。在任何情况下,您还需要处理由于用户提供的参数中存在验证错误而无法创建促销时发生的情况。

于 2013-05-14T21:08:49.663 回答