我正在尝试制作一个允许用户创建活动的页面。我希望他们能够首先保存事件,这将把它放在数据库中,但不允许其他用户看到它。我还希望允许用户发布该事件,这将阻止他们进行更多更改并允许其他用户查看。
我计划在创建活动表单上同时使用“保存”和“发布”按钮。因为保存它意味着它仍然不完整,所以当单击此按钮时我不需要验证任何内容,但是当单击“发布”按钮时我会这样做。
我尝试使用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
我已经确认:当单击发布按钮时,已发布的内容应仅等于“true”。 (当用户点击“发布”时,我通过JS将事件[已发布]设置为true。否则默认为false。)
知道为什么验证总是在执行吗?
编辑:我仍然不确定为什么这不起作用,但我确实发现如果我单独检查每个验证条款,它按预期工作,如下所示:
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?
答案 0 :(得分:2)
你可能在这里使用已发布的拼写错误==" true"而不是:发布=="真"
def published?
self.published == "true"
end
我也注意到你使用了(:after => Time.now)。我认为在生产中,这条生产线只会被评估一次。所以你可能想以某种方式使用lambda来确保在验证时总是调用Time.now