Rails 3的验证定制消息


94

Rails引入了验证模型内部属性的新方法。当我使用

validates :title, :presence => true

它有效,但是当我尝试添加自定义消息时

validates :title, :presence => true,:message => "Story title is required"

产生一个错误

Unknown validator: 'message'

Answers:


196

试试这个

validates :title, presence: { message: "Story title is required" }

19
如何从上述错误消息中删除:title?上面显示为“标题标题为必填项”。我想要“故事标题是必需的”。谢谢。
datauser 2011年

5
=> true这个答案哪里去了?没必要吗?
davetapley

2
@dukedave奇怪的是没有必要。您可以将任何“真实”的信息传递给presence
伤害

1
@NotDan,链接断开。
stevenspiel 2014年

2
@Mayumi-您可以通过编写手动验证并将错误添加到消息中来从消息中删除属性名称:base,例如errors.add(:base, "Story title is required)
Marco Prins 2015年

18

实际上,我以更好的方式做到了这一点。如果要从消息中删除字段标题,则应在_form.htmk.erb视图中使用此标题:

如您在该视图内看到的:

<ul>
  <% @article.errors.full_messages.each do |msg| %>
  <li><%= msg %></li>
  <% end %>
</ul>

替换为:

<ul>
  <% @article.errors.each_with_index do |msg, i| %>
  <li><%= msg[1] %></li>
  <% end %>
</ul>

嗯?为什么,我永远不会
Marco Prins

1

带条件的布尔值的自定义消息可能是:

validates :foo,  inclusion: { in: [true, false], message: "cannot be blank" }, if: :bar?

0

您可以使用导轨3的HUMANIZED_ATTRIBUTES。例如,在上述情况下,它将类似于:

HUMANIZED_ATTRIBUTES = {
:title => "story"
}
 def self.human_attribute_name(attr, options={})
    HUMANIZED_ATTRIBUTES[attr.to_sym] || super
end

它会给您错误消息,用故事替换模型属性标题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.