【问题标题】:Validations during ActiveRecord callbacksActiveRecord 回调期间的验证
【发布时间】:2011-08-29 23:19:59
【问题描述】:

是否可以在 ruby​​ 的 before_save 回调中创建关联模型的新实例时执行验证?

class Podcast < ActiveRecord::Base
has_many :tracks, :dependent=>:destroy

before_save :generate_tracks

# creates the tracks played in the podcast 
def generate_tracks
    json = Hashie::Mash.new HTTParty.get("#{self.json_url}")
    json.sections.each do |section|
      if section.section_type=="track"
        track = self.tracks.build :name=>section.track.name
      end
    end
  end
end 

上面的代码工作正常,但我希望在 if 语句中添加这样的内容:

unless track.valid?
  errors[:base] << "OOPS, something went wrong whilst trying to build tracklist."
  return false
end

这段代码的问题是track.valid?总是返回 false,因为 Track 模型验证 podcast_id 的存在。在 after_create 回调中这样做我感觉不太舒服,因为如果曲目列表也没有验证,我想实际取消播客创建。那我该怎么办?

【问题讨论】:

  • Inside Track 模型我们可以做这样的事情吗。def valid? true end 只需通过验证
  • 我不希望绕过验证。我宁愿删除构建曲目列表的代码。 :)

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

在我看来,你想要的是validates_associated,这会让你这样做:

class Podcast < ActiveRecord::Base
  has_many :tracks

  validates_associated :tracks
end

这样,除非关联的曲目有效,否则播客不会保存。

【讨论】:

  • 不敢相信我不知道这件事!我想应该更好地阅读手册。谢谢,这非常有效,尽管我确实必须删除轨道模型内 podcast_id 上的验证才能使其正常工作。我认为这没关系。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多