0

У меня есть рельсы версии 3.2.13 и рубиновая версия 1.9.3.Rails ведут себя странно

Я попал в очень странную и интересную ситуацию.

В моем приложении есть модель «Продукт» с пользовательским валидатором.

product.rb

class Product < ActiveRecord::Base 
    attr_accessible :description, :name, :price, :short_description, :user_id 
    validates :name, :short_description, presence: true 
    validates :price, :numericality => {:greater_than_or_equal_to => 0} 
    validate :uniq_name 

    belongs_to :user 
    belongs_to :original, foreign_key: :copied_from_id, class_name: 'Product' 
    has_many :clones, foreign_key: :copied_from_id, class_name: 'Product', dependent: :nullify 

    def clone? 
    self.original ? true : false 
    end 

private 

#Custom validator 

def uniq_name 
    return if clone? 
    user_product = self.user.products.unlocked.where(:name => self.name).first 
    errors[:name] << "has already been taken" if user_product && !user_product.id.eql?(self.id) 
end 

end 

В продуктах контроллера создадим действие, когда я пытаюсь создать новый продукт

def create 
    @product = current_user.products.new(params[:product]) 
    respond_to do |format| 
    if @product.save 
     format.html { redirect_to @product, notice: 'Product was successfully created.' } 
     format.json { render json: @product, status: :created, location: @product } 
    else 
     @product.errors[:image] = "Invalid file extension" if @product.errors[:image_content_type].present? 
     format.html { render action: "new" } 
     format.json { render json: @product.errors, status: :unprocessable_entity } 
    end 
end 
end 

валидатора вызывается, когда эта линия выполнена @product = current_user.products.new(params[:product]) и line # 2 обычая валидатор, дающий мне ошибку

undefined method `products' for nil:NilClass 

Я проверил объект продукта в пользовательском валидаторе, но user_id - это нуль. Почему user_id не авторизован?

Ваша помощь будет оценена :)

+1

Попробуйте использовать '.build' вместо' .new' –

+0

Вы уверены, что это происходит из-за проверки, а не потому, что current_user равен нулю? В вашем валидационном коде все в порядке. – gvalmon

+0

@gvalmon, если бы он был nil пользователем ошибка msg была бы другой - я хотел написать, но да, строка не указана –

ответ

0

Итак ... обходя свой вопрос. Почему вы просто не проверяете уникальность имени?

validates_uniqueness_of :name, :unless => :clone?

0

попытка изменить .new к .build

@product = current_user.products.build(params[:product]) 

и быть уверенным, что вы имеете отношение в модели пользователя

Class User < ActiveRecord::Base 
    has_many :products