SDD*_*D64 7 format validation internationalization formtastic ruby-on-rails-3
我们对我们的应用程序使用一些自编写的验证.这些不使用已经翻译的一个,如'空'或'无效'.它们通过默认方式"%{attribute}%{message}"格式化
但是,我们的客户要求在"%{attribute} :%{message} . "中格式化它们,只是添加了一些标点符号.
这些是客户i18n中的错误消息:
errors:
models:
foo:
attributes:
bar:
steak_missing: sie haben Ihr Schnitzel vergessen
beer_missing: sie haben Ihr Bier vergessen
Run Code Online (Sandbox Code Playgroud)
导致丑陋:
Bar sie haben Ihr Schnitzel vergessen
Run Code Online (Sandbox Code Playgroud)
由于这些可以链接,我们需要像这样:
Bar: sie haben Ihr Schnitzel vergessen, sie haben Ihr Bier vergessen.
Run Code Online (Sandbox Code Playgroud)
在基础i18n中改变了这个:
errors: &errors
format: ! "%{attribute}: %{message}."
Run Code Online (Sandbox Code Playgroud)
完全没有效果.也没有完全删除或其他任何东西.我们正在使用formtastic及其semantic_errors,它是否为(默认)错误消息提供了自己的i18n?
如果我正确理解你的问题 - 你在表格中使用类似的内容:
<%= f.semantic_errors :bar %>
Run Code Online (Sandbox Code Playgroud)
要改变semantic_errors行为,您可以对此方法进行猴子修补。为此,只需添加{RAILS_ROOT}/config/initializers/semantic_errors_patch.rb包含内容的文件:
Formtastic::Helpers::ErrorsHelper.class_eval do
def semantic_errors(*args)
html_options = args.extract_options!
args = args - [:base]
full_errors = args.inject([]) do |array, method|
attribute = localized_string(method, method.to_sym, :label) || humanized_attribute_name(method)
errors = Array(@object.errors[method.to_sym]).to_sentence
errors.present? ? array << [attribute, errors].join(": ") : array ||= []
end
full_errors << @object.errors[:base]
full_errors.flatten!
full_errors.compact!
return nil if full_errors.blank?
html_options[:class] ||= "errors"
template.content_tag(:ul, html_options) do
Formtastic::Util.html_safe(full_errors.map { |error| template.content_tag(:li, Formtastic::Util.html_safe(error)) }.join)
end
end
end
Run Code Online (Sandbox Code Playgroud)
该补丁与formtastic 2.2.1和配合使用效果很好rails 3.2.13。
此补丁将为两个错误生成下一个字符串:
酒吧: sie haben Ihr Schnitzel vergessen 和 sie haben Ihr Bier vergessen。
如果有更多错误,它将产生类似以下内容:
金额:不是数字,不能为空,且太短(最少 2 个字符)
您可以在这一行更改此行为:
errors = Array(@object.errors[method.to_sym]).to_sentence
Run Code Online (Sandbox Code Playgroud)
@object.errors[method.to_sym]- 是产生最终errors字符串的错误的集合。