【问题标题】:Validation only in specific form仅以特定形式验证
【发布时间】:2011-09-25 13:40:20
【问题描述】:

有没有办法只在特定形式(控制器的操作)中触发验证,而不是在每次保存或更新时全局触发验证? 类似于User.create(:validate=>true) 标志。

【问题讨论】:

  • 你为什么要这样做?如果我们知道您的问题背后的原因,也许我们可以给出更好的答案。
  • 我弄乱了用户模型,没有与个人资料分开,注册时只需要提供几个字段,剩下的就是从编辑用户操作中填写。
  • 顺便说一句,您可以像这样通过所有验证:Model.save(false)
  • 我只想指出这听起来是个坏主意。验证可以保护您的数据库免受无意义的数据的影响。
  • 我知道,但我不想重建一半的应用程序......一些基本的验证是强制性的。

标签: ruby-on-rails validation


【解决方案1】:

是的,您可以为验证提供条件,例如:

validates_presence_of :something, :if => :special?

private

def make_sepcial
  @special = true
end

def special?
  @special
end

现在您需要做的就是打开这些验证:

s = SomeModel.new
s.make_special

【讨论】:

  • 不。 @special 只是一个实例变量。除非你有进一步的工作要做,否则你可以让它死掉,它不会被持久化到进一步的数据库查询中。
【解决方案2】:

正如您在 cmets 中所解释的,您希望跳过对新记录的验证。在这种情况下,您可以使用 thomasfedb 的答案,但不要使用 @special 变量,但是:

validates_presence_of :something, :if => :persisted?

这将仅对已保存的Users 有效,但对新的Users 无效。请参阅persisted? 上的 API 文档。

【讨论】:

  • 你也可以使用 :unless => :persisted?如果你想要反向 - 验证新但不保存。
【解决方案3】:

这有点老了。但我发现http://apidock.com/rails/Object/with_options 是处理此类行为的好方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2023-04-07
    • 2022-01-11
    • 2019-07-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多