1

我正在尝试制作一个允许用户创建事件的页面。我希望他们能够先保存事件,这会将其放入数据库但不允许其他用户看到它。我还希望允许用户发布事件,这将阻止他们进行更多更改并允许其他用户看到它。

我计划通过在创建事件表单上同时使用“保存”和“发布”按钮来做到这一点。因为保存它意味着它仍然不完整,所以单击此按钮时我真的不需要验证任何内容,但是单击“发布”按钮时我会这样做。

我尝试使用 event.rb 中的以下代码来完成此操作,但是单击任一按钮时正在执行验证。

with_options :if => :published? do
  validates_date :date, presence: true, :after => Time.now, :after_message => 'must be in the future'
  validates_time :time, presence: true
end

def published?
  :published == "true"
end

我已经确认 :published 应该只在单击发布按钮时等于“true”。(当用户单击“发布”时,我通过 JS 将 event[published] 设置为 true。否则默认为 false。)

知道为什么验证总是在执行吗?

编辑:我仍然不确定为什么这不起作用,但我确实发现如果我单独检查每个 validates 子句,它会按预期工作,如下所示:

validates_date :date, presence: true, :after => lambda { Time.now }, :after_message => 'must be in the future', :if => :published?
validates_time :time, presence: true, :if => :published?
4

1 回答 1

2

您可能在这里打错字,请使用 published == "true" 而不是 :published == "true"

def published?
    self.published == "true"
end

我还注意到您使用 (:after => Time.now)。我认为在生产中这条生产线只会被评估一次。所以你可能想以某种方式使用 lambda 来确保 Time.now 在验证时总是被调用

于 2012-12-16T19:11:41.313 回答