2016-06-09 83 views
1

我知道我失去了一些東西簡單,但在這裏,導軌導向表明,可以出現在session_store.rb下面的示例配置:什麼是看起來像方法調用的ruby/rails語法?

Rails.application.config.session_store :cookie_store, key: '_your_app_session', domain: ".example.com" 

它看起來像一個方法的調用:session_store與ARGS。然而session_store似乎實際上是ActionDispatch::Session::ActiveRecordStore的一個實例。

那麼,這裏究竟發生了什麼?

+2

它是一個方法調用,'ActionDispatch :: Session :: ActiveRecordStore'是方法的返回值。 – Stefan

+0

謝謝。我似乎無法找到Rails :: Application :: Configuration或其父母記錄的此方法。它應該是?我嘗試了'Rails.application.config.session_store.source_location'來試圖確定它的定義。 – Noob123

+0

嘗試'Rails.application.config.method(:session_store).source_location',它應該指向[.../gems/railties-4.2.6/lib/rails/application/configuration.rb:163](https: //github.com/rails/rails/blob/v4.2.6/railties/lib/rails/application/configuration.rb#L163) – Stefan

回答

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然而,調用方法時,括號是可選的,既foofoo()調用方法:

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

相關問題