未验证 提交 f2cd46bd 编写于 作者: R Rafael França 提交者: GitHub

Merge pull request #35424 from Korri/validation-rules-locale-fallback

Fall back to parent locale before falling back to the :errors namespace
* Changed how validation error translation strings are fetched: The new behaviour
will first try the more specific keys, including doing locale fallback, then try
the less specific ones.
For example this is the order keys will now be tried for a `blank` error on a
`product`'s `title` attribute with current locale set to `en-US`:
en-US.activerecord.errors.models.product.attributes.title.blank
en-US.activerecord.errors.models.product.blank
en-US.activerecord.errors.messages.blank
en.activerecord.errors.models.product.attributes.title.blank
en.activerecord.errors.models.product.blank
en.activerecord.errors.messages.blank
en-US.errors.attributes.title.blank
en-US.errors.messages.blank
en.errors.attributes.title.blank
en.errors.messages.blank
*Hugo Vacher*
## Rails 6.0.0.beta2 (February 25, 2019) ##
* Fix date value when casting a multiparameter date hash to not convert
......
......@@ -479,6 +479,14 @@ def full_message(attribute, message)
# * <tt>errors.messages.blank</tt>
def generate_message(attribute, type = :invalid, options = {})
type = options.delete(:message) if options[:message].is_a?(Symbol)
value = (attribute != :base ? @base.send(:read_attribute_for_validation, attribute) : nil)
options = {
model: @base.model_name.human,
attribute: @base.class.human_attribute_name(attribute),
value: value,
object: @base
}.merge!(options)
if @base.class.respond_to?(:i18n_scope)
i18n_scope = @base.class.i18n_scope.to_s
......@@ -487,6 +495,11 @@ def generate_message(attribute, type = :invalid, options = {})
:"#{i18n_scope}.errors.models.#{klass.model_name.i18n_key}.#{type}" ]
end
defaults << :"#{i18n_scope}.errors.messages.#{type}"
catch(:exception) do
translation = I18n.translate(defaults.first, options.merge(default: defaults.drop(1), throw: true))
return translation unless translation.nil?
end unless options[:message]
else
defaults = []
end
......@@ -496,15 +509,7 @@ def generate_message(attribute, type = :invalid, options = {})
key = defaults.shift
defaults = options.delete(:message) if options[:message]
value = (attribute != :base ? @base.send(:read_attribute_for_validation, attribute) : nil)
options = {
default: defaults,
model: @base.model_name.human,
attribute: @base.class.human_attribute_name(attribute),
value: value,
object: @base
}.merge!(options)
options[:default] = defaults
I18n.translate(key, options)
end
......
......@@ -4,16 +4,20 @@
require "models/topic"
class I18nGenerateMessageValidationTest < ActiveRecord::TestCase
class Backend < I18n::Backend::Simple
include I18n::Backend::Fallbacks
end
def setup
Topic.clear_validators!
@topic = Topic.new
I18n.backend = I18n::Backend::Simple.new
I18n.backend = Backend.new
end
def reset_i18n_load_path
@old_load_path, @old_backend = I18n.load_path.dup, I18n.backend
I18n.load_path.clear
I18n.backend = I18n::Backend::Simple.new
I18n.backend = Backend.new
yield
ensure
I18n.load_path.replace @old_load_path
......@@ -83,4 +87,16 @@ def test_generate_message_taken_with_custom_message
assert_equal "Custom taken message", @topic.errors.generate_message(:title, :taken, value: "title")
end
end
test "activerecord attributes scope falls back to parent locale before it falls back to the :errors namespace" do
reset_i18n_load_path do
I18n.backend.store_translations "en", activerecord: { errors: { models: { topic: { attributes: { title: { taken: "custom en message" } } } } } }
I18n.backend.store_translations "en-US", errors: { messages: { taken: "generic en-US fallback" } }
I18n.with_locale "en-US" do
assert_equal "custom en message", @topic.errors.generate_message(:title, :taken, value: "title")
assert_equal "generic en-US fallback", @topic.errors.generate_message(:heading, :taken, value: "heading")
end
end
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册