使用Rails我试图在保存时收到类似“歌曲字段不能为空”的错误消息 . 执行以下操作:
validates_presence_of :song_rep_xyz, :message => "can't be empty"
...仅显示“Song Rep XYW不能为空”,这不好,因为该字段的 Headers 不是用户友好的 . 如何更改字段本身的 Headers ?我可以更改数据库中字段的实际名称,但我有多个“歌曲”字段,我需要具有特定的字段名称 .
我不想破解rails的验证过程,我觉得应该有办法解决这个问题 .
17 回答
现在,设置人性化名称和自定义错误消息的可接受方法是use locales .
现在,已更改"email"属性的人性化名称和状态验证消息 .
可以为特定模型属性,模型,属性或全局设置验证消息 .
在你的模型中:
在你看来
如果你做了
您收到带有属性名称的此错误消息
如果要获取单个属性的错误消息
试试这个 .
我找到了here .
这是另一种方法 . 您要做的是在模型类上定义human_attribute_name方法 . 该方法作为字符串传递列名,并返回要在验证消息中使用的字符串 .
以上代码来自here
是的,没有插件就有办法做到这一点!但它并不像使用上述插件那样干净优雅 . 这里是 .
假设它是Rails 3(我不知道它在以前的版本中是否有所不同),
将其保留在您的模型中:
在视图中,而不是离开
就像我们使用脚手架发电机时一样,放:
并且您将获得您在模型中指定的消息,而没有属性名称 .
说明:
到目前为止,我们只显示一条消息,始终为第一个错误 . 如果您想显示所有错误,可以在哈希中循环并显示值 .
希望有所帮助 .
带有完全本地化消息的Rails3代码:
在模型user.rb中定义验证
在config / locales / en.yml中
在自定义验证方法中使用:
errors.add(:base, "Custom error message")
因为add_to_base已被弃用 .
errors.add_to_base("Custom error message")
我建议安装最初由David Easley编写的custom_error_message gem(或作为plugin)
它可以让你做的事情:
与accepted answer和another answer down the list相关:
我确认nanamkim's fork of custom-err-msg适用于Rails 5,并且使用语言环境设置 .
您只需要使用插入符启动语言环境消息,它不应在消息中显示属性名称 .
模型定义为:
以下
en.yml
:item.errors.full_messages
将显示:而不是通常
Name You can't create an item without a name
这是另一种方式:
如果您使用此模板:
您可以编写自己的自定义消息,如下所示:
这样,由于下划线,完整的消息变为" My custom message",但开头的额外空间是不明显的 . 如果你真的不想在开头有额外的空间,只需添加
.lstrip
方法 .String.lstrip方法将摆脱':_'创建的额外空间,并将保留其他任何错误消息 .
或者甚至更好,使用自定义消息的第一个单词作为关键:
现在,完整的消息将是“我的自定义消息”,没有额外的空间 .
如果您希望完整的消息以大写字母开头,例如“URL不能为空”,则无法完成 . 而是尝试添加一些其他单词作为键:
现在完整的消息将是“URL不能为空”
按照正常的方式做到:
但是显示它就像这样
返回
本地化方法绝对是实现这一目标的“正确”方法,但如果您正在做一些非全局项目并希望快速进行 - 这肯定比文件跳转更容易 .
我喜欢将字段名称放在字符串开头以外的地方:
一种解决方案可能是更改i18n默认错误格式:
默认是
format: %{attribute} %{message}
如果你想将它们全部列在一个不错的列表中,但没有使用这个非常友好的名字,你可以这样做......
在你看来
如果要覆盖不带属性名称的错误消息,只需在消息前加上^,如下所示:
我试过跟随,为我工作:)
1 job.rb
2 jobs_controller.rb
3 _form.html.erb
这是我的代码,如果您仍然需要它可以对您有用:我的模型:
然后我创建了一个帮助器来显示消息:
如果您正在使用Rails-5您还可以使用以下内容:
我能够获得我想要的所有自定义的唯一方法是使用
after_validation
回调来允许我操作错误消息 .允许正常创建验证消息,您无需在验证帮助程序中尝试更改它 .
创建一个
after_validation
回调,它将在后端到达视图之前替换后端的验证消息 .在
after_validation
方法中,您可以使用验证消息执行任何操作,就像普通字符串一样!您甚至可以使用动态值并将其插入验证消息中 .after_validation方法将具有比内置rails验证助手更大的范围,因此您将能够访问您正在验证的对象,就像您尝试使用object.file_name一样 . 哪个在您尝试调用它的验证助手中不起作用 .
注意:我们使用
^
在验证开始时删除属性名称,因为@Rystraum指出引用此gem