class RuboCop::Cop::Rails::DotSeparatedKeys
I18n.t :record_invalid, scope: ‘activerecord.errors.messages’
I18n.t ‘activerecord.errors.messages.record_invalid’
# good
I18n.t :title, scope: :invitation
I18n.t :record_invalid, scope: [:activerecord, :errors, :messages]
# bad
@example
Dot-separated notation is easier to read and trace the hierarchy.
with an array or a single symbol in ‘I18n` translation methods.
Enforces the use of dot-separated locale keys instead of specifying the `:scope` option
def new_key(key_node, scope_node)
def new_key(key_node, scope_node) "'#{scopes(scope_node).map(&:value).join('.')}.#{key_node.value}'".squeeze('.') end
def on_send(node)
def on_send(node) return unless TRANSLATE_METHODS.include?(node.method_name) translate_with_scope?(node) do |key_node, scope_node| return unless should_convert_scope?(scope_node) add_offense(scope_node) do |corrector| # Eat the comma on the left. range = range_with_surrounding_space(scope_node.source_range, side: :left) range = range_with_surrounding_comma(range, :left) corrector.remove(range) corrector.replace(key_node, new_key(key_node, scope_node)) end end end
def scopes(scope_node)
def scopes(scope_node) value = scope_node.value if value.array_type? value.values else [value] end end
def should_convert_scope?(scope_node)
def should_convert_scope?(scope_node) scopes(scope_node).all?(&:basic_literal?) end