#2 楼 @dimos locale 是 actionview 里边的代理方法:
[1] pry(#<HomeController>)> show-source locale
From: /Users/martin/.rvm/gems/ruby-2.3.1/gems/actionview-5.0.0/lib/action_view/view_paths.rb @ line 11:
Owner: ActionView::ViewPaths
Visibility: public
Number of lines: 2
delegate :template_exists?, :any_templates?, :view_paths, :formats, :formats=,
:locale, :locale=, :to => :lookup_context
lookup_context
方法定义如下:
def lookup_context
@_lookup_context ||=
ActionView::LookupContext.new(self.class._view_paths, details_for_lookup, _prefixes)
end
而 ActionView::LookupContext
中有相关的实现代码:
module ActionView
class LookupContext
def locale
@details[:locale].first
end
# Overload locale= to also set the I18n.locale. If the current I18n.config object responds
# to original_config, it means that it has a copy of the original I18n configuration and it's
# acting as proxy, which we need to skip.
def locale=(value)
if value
config = I18n.config.respond_to?(:original_config) ? I18n.config.original_config : I18n.config
config.locale = value
end
super(default_locale)
end
end
end
天色已晚,我就不深入研究了,反正路是这条路,还可以继续看 LookupContext
里的 self.register_detail
方法定义以及调用。
另外,Ruby 全局变量名是用 $
开头的,如果遇到一个看起来像变量但又有全局特性的“变量”的话,基本可以判断其实它是一个方法了。
另外,像这种生僻方法,还是减少使用比较好,增加同一项目共同维护者的负担。还是用 I18n.locale
就好了。