使用Rails验证助手 -
validates_xxx_of :the_column, :message => "my message"
将生成验证消息:
the_column my message
有没有办法关闭列名的包含? (用任何验证助手方法替换xxx)
答案 0 :(得分:16)
我知道这个问题已经过时了。但仅供参考,万一其他人就像我刚才那样偶然发现它。
至少在Rails 3.0.x中(不确定早期版本)你可以使用RadBrad指示的前导^,而不需要任何宝石/插件。
答案 1 :(得分:7)
看看这里的代码:
https://github.com/rails/rails/blob/master/activemodel/lib/active_model/errors.rb#L374
因此,您可以在en.yml文件中设置:
en:
errors:
format: '%{message}'
这意味着您还需要在其他地方设置完整的错误消息,但我想这更可取。注意,我发现这个令人困惑,错误格式不在ActiveRecord命名空间中,我通常将其余的错误消息放入其中。
答案 2 :(得分:6)
有一个客户错误消息gem应该做你想做的事情
https://github.com/jeremydurham/custom-err-msg
它允许您覆盖正常的消息构造,并自己定义完整的消息,如下所示:
:消息=> “^您的电子邮件地址似乎相当混乱,请再试一次”
注意^字符,告诉rails不要预先添加任何内容,只需使用完全按照定义的消息,(除了它删除^)
如果你没有设置前导^,那么你会得到正常的rails生成错误信息。
答案 3 :(得分:3)
这是我能找到的最佳解释。
http://adamhooper.com/eng/articles/5
基本上,在初始化程序中,如果在验证中给出:message属性,则更改ActiveRecord.Errors中的full_messages方法以返回完整句子(而不是column_name,消息串联)。
更新 - 如果您尝试使用Adam的代码,则必须使用en.yml属性文件,否则它将无法按预期工作。您可以通过进一步修改full_messages方法来执行此操作或绕过它。这适合我。我将以下内容添加到初始化程序(/imitializers/active_record_errors.rb)
if RAILS_GEM_VERSION =~ /^2\.3/
ActiveRecord::Errors.class_eval do
# Remove complicated logic
def full_messages
returning full_messages = [] do
@errors.each_key do |attr|
@errors[attr].each do |message|
next unless message
if attr == "base"
full_messages << message
elsif message =~ /^\^/
full_messages << $' #' Grabs the text after the '^'
else
attr_name = @base.class.human_attribute_name(attr)
full_messages << attr_name + I18n.t('activerecord.errors.format.separator', :default => ' ') + message
end
end
end
end
end
end
end
Adam也提出了修改Rails以支持国际化努力的良好论据。
答案 4 :(得分:1)
我这样做的方式是覆盖所有消息,而不是使用Rails表单帮助程序来显示错误消息。
这似乎很多工作,但它实际上有一些很好的好处。您可以完全控制该消息,然后您可以实现一个自定义表单构建器,该构建器可以将错误消息内联,这对用户来说更好。
你这样使用它:
validates_uniqueness_of :foobar, :message => "The foobar isn't unique."
然后在打印错误消息时不要使用full_messages
。
答案 5 :(得分:1)
链接到rubyforge不起作用,这是github上的自定义错误消息插件:
答案 6 :(得分:1)
为什么不简单地使用@ object.errors哈希?!
在验证部分中更改消息:
validates_uniqueness_of:foobar,:message =&gt; “foobar不是唯一的。”
然后,
@ foo.errors.to_a
你得到一个很好的数组,其中第二个条目是错误信息本身。
答案 7 :(得分:1)
在rails 2中,您可以对您的模型进行操作:
validate :test_validation
private
def test_validation
if error_condition
errors.add_to_base("Message")
end
end
在rails 3或更高版本中:
validate :test_validation
private
def test_validation
if error_condition
errors[:base] << "Message"
end
end
答案 8 :(得分:0)
我对RoR 3.0.3也有同样的问题。我没有找到一种方法来显示没有属性名称的验证消息。 Swards之前发布的代码对我不起作用,但这是一个好的开始。
我将以下代码放在config / initializers文件夹中的RB文件中:
ActiveModel::Errors.class_eval do
# Remove complicated logic
def full_messages
full_messages = []
each do |attribute, messages|
messages = Array.wrap(messages)
next if messages.empty?
if attribute == :base
messages.each {|m| full_messages << m }
else
attr_name = attribute.to_s.gsub('.', '_').humanize
attr_name = @base.class.human_attribute_name(
attribute,
:default => attr_name
)
options = { :default => "%{message}", :attribute => attr_name }
messages.each do |m|
full_messages << I18n.t(:"errors.format", options.merge(:message => m))
end
end
end
full_messages
end
end
这会从所有消息中删除属性的名称,这正是我想要做的。
答案 9 :(得分:0)
答案 10 :(得分:0)
对于那些偶然发现(并且可能滚动到底部)寻找如何在Rails的更高版本中执行此操作的人来说,这里有一些好消息:在此之后在Rails 4中执行此操作非常简单{{3合并。在某些情况下可能需要一些额外的抛光,但这里已经取得了进展。
在此之前,您可以使用pull请求在项目中修补Rails:)
class ActiveModel::Errors
def full_message(attribute, message)
return message if attribute == :base
attr_name = attribute.to_s.tr('.', '_').humanize
attr_name = @base.class.human_attribute_name(attribute, :default => attr_name)
I18n.t(:"errors.formats.attributes.#{attribute}", {
:default => [:"errors.format","%{attribute} %{message}"],
:attribute => attr_name,
:message => message
})
end
end
并在您的语言环境文件中添加以下内容:
en:
errors:
formats:
attributes:
name: '%{message}'
答案 11 :(得分:0)
这是一个相当简单的实现,应该可以解决问题。值得注意的是,它只影响单个模型(与我见过的大多数基于语言环境的技巧不同)并且不会太笨重......它只是修改了一个对象:
class Widget < ActiveRecord::Base
validates_numericality_of :quantity, greater_than: 0, message: "numericality"
def errors
super.tap do |e|
e.extend(FixQuantityErrorMessage)
end
end
module FixQuantityErrorMessage
def full_message(attribute, message)
if attribute.to_s == 'quantity' && message == "numericality"
"You need at least one!"
else
super
end
end
end
end