NoMethodError显示问题

时间:2014-05-17 22:53:32

标签: ruby-on-rails ruby ruby-on-rails-4

我的模型看起来像:

class Product < ActiveRecord::Base

  before_create :generate_token

  def to_param
    token
  end

  private

  def generate_token

    self.token = loop do
       random_token = SecureRandom.urlsafe_base64(10, false)
       break random_token unless Product.exists?(token: random_token)
    end
  end

end

我的控制器如下:

def set_product
  @product = Product.find_by(token: params[:token])
end

当我创建新产品时,我收到错误:

NoMethodError in ProductsController#show
undefined method `name' for nil:NilClass

我的控制器中的节目如下:

def show
   @title = @product.name
end

我的创建看起来像:

def create
@product = Product.new(product_params)
#@product.user_id = current_user.id
respond_to do |format|
  if @product.save
    format.html { redirect_to @product, notice: 'Product was successfully created.' }
    format.json { render action: 'show', status: :created, location: @product }
  else
    format.html { render action: 'new' }
    format.json { render json: @product.errors, status: :unprocessable_entity }
  end
end
end

另外,在我的控制器中,我有一个看起来像的回调:

before_action :set_product, only: [:show, :edit, :update, :destroy]

但是在rails控制台插入中,它显示了正在插入的名称。正在设置名称列。

1 个答案:

答案 0 :(得分:2)

你能告诉我你去那个页面的网址吗

如果您通过product_path(令牌)传递令牌

然后尝试

def set_product
  @product = Product.find_by(token: params[:id]) # id instead of token
end

如果是表格,那么

def set_product
  @product = Product.find_by(token: params[:product][:token])
end

我确定你当前的params [:token]不对,这就是你找不到产品的原因。