创建关联后控制器中的Ruby on Rails NoMethodError

问题描述 投票:1回答:1

我有两个模型User和Promotion,一个用户可以创建has_many促销,一个促销属于user,所以:

promotion.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#Noil中的NoMethodError为nil:NilClass创建未定义的方法“ promotions”

这是控制器:

 def create
@user = User.find_by_id(params[:user_id])
@promotion [email protected](: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

请帮助 :)

ruby-on-rails controller associations has-many nomethoderror
1个回答
1
投票

看起来params [:user_id]没有包含有效的用户ID。 由于您使用的是find_by_id而不是find,因此它悄悄地将nil分配给@user,当然nil没有名为#promotions的方法,因此该行失败了。

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

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

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

Devise应该已经有current_user了。 无论如何,您还需要处理由于用户提供的参数中存在验证错误而无法创建促销的情况。

© www.soinside.com 2019 - 2024. All rights reserved.