在我的用户模型中,我有以下验证:
validates :password, :presence => true, :length => { minimum: 8 }, :on => :update_settings
如果我不使用:on
验证器,它的工作原理是全面的。但是使用:on我在执行指定的操作时没有得到任何验证。
表单将转到:action="/users/1/update_settings"
路线设置为:user_update_settings PUT /users/:user_id/update_settings(.:format) users#update_settings
我查看了指南here。相同的验证适用于标准操作,例如:创建但不依赖于我自己的操作。
你能看到我还缺少什么来使这个验证有效吗?谢谢!
答案 0 :(得分:2)
我认为你对:on
选项的含义感到困惑。它不是用于指定控制器上的操作,而是用于指定记录上的操作。完全违背MVC原则,将控制器操作与模拟验证联系起来,就像你在这里尝试一样。
检查docs:
使用:on选项可以指定何时进行验证。所有内置验证助手的默认行为都是在保存时运行的(无论是在创建新记录时还是在更新时)。如果您想更改它,可以使用:on => :create仅在创建新记录时运行验证或:on => :更新以仅在更新记录时运行验证。
因此,on
选项仅采用以下三种可能值之一::save
(默认值),:update
或:create
。
根据您的操作名称(update_settings
),我将假设您在该操作中调用模型上的update_attributes
(或update_attribute
),在这种情况下你应该在你的验证器中使用:on => :update
。请注意,这意味着它还将在更新记录的任何其他控制器操作中应用验证,因为该条件不特定于任何特定的控制器操作。