Rails密码正则验证自定义错误消息配置失败求助
我来帮你搞定这两个密码验证错误消息的问题,这俩坑我之前开发的时候也踩过,太懂这种抓狂的感觉了!
问题1:Unknown validator: 'MessageValidator' 报错
你之所以会遇到这个错误,是因为把message参数放错位置了——你把它当成了validates方法的顶级配置项,但Rails会把任何顶级的非内置验证器参数当成一个新的验证器来加载,所以才会找不到MessageValidator。
正确的做法是把message嵌套在format的哈希里面,因为它是格式验证规则的一部分,而不是独立的验证器。修改后的代码如下:
has_secure_password VALID_PASSWORD_REGEX = /\A(?=.*[a-z])(?=.*[A-Z])(?=.*[\W])(?=.*[\d])[\S]{8,15}\z/ validates :password, format: { with: VALID_PASSWORD_REGEX, message: 'should contain uppercase, lowercase, number and special character. Between 8 and 15 characters long' }, allow_nil: true
问题2:YAML配置的自定义错误消息不生效
你的locale文件结构有误,而且没对应到格式验证的错误键。这里要注意两点:
- 如果你的
Employee是ActiveRecord模型(绝大多数Rails模型都是),要使用activerecord节点,而不是activemodel; - 格式验证失败时,Rails会查找
invalid这个子键,而不是直接覆盖属性的错误文本。
修改后的en.yml应该是这样:
en: activerecord: attributes: employee: password: "Password" errors: models: employee: attributes: password: invalid: "should contain at least one uppercase, lowercase, numeric and special character. Between 8 and 15 characters long"
另外补充一点:你的视图是通过flash展示消息,但模型验证的错误默认存在@employee.errors对象里,不是flash。如果控制器没把错误消息放到flash里,要么调整控制器代码(比如把错误转成flash消息),要么直接在视图里遍历@employee.errors:
<% if @employee.errors.any? %> <% @employee.errors.full_messages.each do |msg| %> <div class="alert alert-error"><%= msg %></div> <% end %> <% end %>
内容的提问来源于stack exchange,提问作者NIkhil D Anand
相关产品推荐
相关产品推荐

