Rails - почему моя пользовательская проверка запускается только для команды сборки - PullRequest
1 голос
/ 27 апреля 2010

У меня есть предложение и модель исправления с отношениями has_one и own_to соответственно.

По какой-то причине, когда я делаю

 def create

        @sentence   = Sentence.find(params[:sentence_id])
        @correction = @sentence.build_correction(params[:correction])

пользовательская проверка, которую я написал для исправления, вызывается в точке build_correction. проверка ниже

class Correction < ActiveRecord::Base
   attr_accessible :text, :sentence_id, :user_id
   belongs_to :sentence
   belongs_to :user

   validate :correction_is_different_than_sentence

   def correction_is_different_than_sentence
     errors.add(:text, "can't be the same as the original sentence.") if (text == self.sentence.text)
   end

проблема по какой-то причине при проверке корректирующего объекта не имеет установленного идентификатора предложения (несмотря на то, что я использовал метод build_correction), и поэтому он жалуется "у вас есть объект nil .... при выполнении nil.text" в предложении if в приведенной выше проверке.

Так что мой вопрос - почему происходит проверка команды сборки, я думал, что она запускается только при создании или обновлении. И почему не задано предложение:

Ответы [ 2 ]

0 голосов
/ 21 июля 2013

Некоторая ошибка создала много головных болей для меня. Не знаю почему, но перемещение пользовательского вызова валидатора в конец других вызовов валидатора исправило это для меня.

До

  validates :name, :short_description, presence: true
  validate :uniq_name
  validates :price, :numericality => {:greater_than_or_equal_to => 0}
  validates_attachment_content_type :image, :content_type => /image/

* После 1009 *

  validates :name, :short_description, presence: true
  validates :price, :numericality => {:greater_than_or_equal_to => 0}
  validates_attachment_content_type :image, :content_type => /image/
  validate :uniq_name

вот мой пользовательский валидатор

private

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

Попробуй, может быть, это тоже поможет тебе.

0 голосов
/ 27 апреля 2010

Как всегда, это была не ошибка рельсов, а моя собственная - это тривиально, долго объяснять, бесполезно никому другому, поэтому объяснять не буду

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...