我知道我在这里遗漏了一些简单的东西,但是rails指南显示了以下可以出现在session_store.rb中的示例配置:
Rails.application.config.session_store :cookie_store, key: '_your_app_session', domain: ".example.com"
看起来像是一个方法的调用:带有args的session_store。但是session_store似乎实际上是ActionDispatch::Session::ActiveRecordStore
的实例。
那么,这里到底发生了什么?
答案 0 :(得分:1)
执行时
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]