我有一个句子和修正模型,分别带有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?
答案 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)
一如既往,它不是铁路故障,而是我自己的 - 它的微不足道,长期解释,对任何人都没有用,所以不会解释。