我知道我在这里缺少一些简单的东西,但是,rails指南显示了以下可以出现在session_store.rb中的示例配置:
Rails.application.config.session_store :cookie_store, key: '_your_app_session', domain: ".example.com"
这看起来像是对方法的调用:session_store 与参数。 然而session_store这里似乎实际上是ActionDispatch::Session::ActiveRecordStore
的一个实例。
那么,这里到底发生了什么?
执行时
Rails.application.config.session_store
#=> ActionDispatch::Session::ActiveRecordStore
您正在调用 session_store
方法。 ActionDispatch::Session::ActiveRecordStore
是方法的返回值,而不是方法本身。由于ActiveRecordStore
是一个类,它不会响应source_location
:
Rails.application.config.session_store.source_location
#=> NoMethodError: undefined method `source_location' for ActionDispatch::Session::CookieStore:Class
在 JavaScript(和其他语言)中,可以通过其名称引用函数,并通过附加括号来调用:
function foo() {
return 123;
}
foo // function() { return 123; }
typeof foo // "function"
foo() // 123
typeof foo() // "number"
但是,在 Ruby 中,调用方法时括号是可选的,foo
和foo()
调用该方法:
def foo
123
end
foo #=> 123
foo.class #=> "fixnum"
foo() #=> 123
foo().class #=> "fixnum"
若要获取给定方法名称的Method
对象,必须在其接收器上调用 method
方法:
method(:foo) #=> #<Method: Object#foo>
在您的情况下:
Rails.application.config.method(:session_store)
#=> #<Method: Rails::Application::Configuration#session_store>
Rails.application.config.method(:session_store).source_location
#=> [".../gems/railties-4.2.6/lib/rails/application/configuration.rb", 163]
以下是源代码:railties/lib/rails/application/configuration.rb:163