У меня есть рельсы версии 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
не авторизован?
Ваша помощь будет оценена :)
Попробуйте использовать '.build' вместо' .new' –
Вы уверены, что это происходит из-за проверки, а не потому, что current_user равен нулю? В вашем валидационном коде все в порядке. – gvalmon
@gvalmon, если бы он был nil пользователем ошибка msg была бы другой - я хотел написать, но да, строка не указана –