Rails - 为什么我的自定义验证仅针对构建命令触发

时间:2010-04-27 11:17:59

标签: ruby-on-rails validation

我有一个句子和修正模型,分别带有has_one和belongs_to关系。

出于某些原因,我

 def create

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

我在build_correction点调用了我为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

问题是由于某种原因验证修正对象没有设置句子id(尽管我使用了build_correction方法)所以它抱怨 “你在上面的验证中的if子句中有nil对象....执行nil.text时”。

所以我的问题是为什么对于构建命令进行验证,我认为它只在创建或更新时触发。为什么没有设置sentence_id?

2 个答案:

答案 0 :(得分:0)

有些错误给我带来了很多麻烦。不知道为什么,但是将自定义验证器调用移到其他验证器调用的末尾为我修复了这个问题。

<强>之前

  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/

<强>后

  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

试试这个,可能也会为你做这个伎俩。

答案 1 :(得分:-3)

一如既往,它不是铁路故障,而是我自己的 - 它的微不足道,长期解释,对任何人都没有用,所以不会解释。