2017-11-15 19 views
2

routes.rbファイルに次のコードがあるとします。Ruby on Railsのroute.rb構文について混乱しています

get '/dashboard', to: 'dashboard#index', :as => 'dashboard' 

私は何が起こっているのか知っています(公開URLはリクエストを処理して返す特定のコントローラ/ビューファイルにマップされています)。それは私が混乱していることではありません。 Rubyの初心者として

、私はRubyのコードの慣例これが何であるかについて困惑しています。変数を宣言するか、メソッドを呼び出す正しい方法のようには見えませんか?正確には何が起こっていますか?これをメソッドと呼ぶいくつかの略式形式ですか?

get("/dashboard", "dashboard#index", "dashboard") 

答えて

2

あなたは非常に近いです。

はい、getが呼び出されるメソッドです。ルビでは、かっこは省略できます。

to::ashashよう getによって受信されたパラメータを命名している
get("/dashboard", to: "dashboard#index", :as => "dashboard") 

:だから、

get '/dashboard', to: 'dashboard#index', :as => 'dashboard' 

は同じです。

私は、このメソッドはaction_dispatch/routing/mapper.rbで定義されている思い

module ActionDispatch 
    module Routing 
    class Mapper 

     module HttpHelpers 
     # Define a route that only recognizes HTTP GET. 
     # For supported arguments, see match[rdoc-ref:Base#match] 
     # 
     # get 'bacon', to: 'food#bacon' 
     def get(*args, &block) 
      map_method(:get, args, &block) 
     end 
     ... 
     end 

    end 
    end 
end 

だから、あなたはto: "dashboard#index", :as => "dashboard"*argsによって受信され、splat operatorは、引数の可変長セットすることができますことがわかります。

+0

"to:"は "get"メソッドのパラメータ(明示的に)の名前にすぎませんか? 2番目の部分は、ハッシュのキーと値のペアにすぎません。 – mute

+0

私は 'to'が' get'のオプションではないと思っています...私はRailsが '/ dashboard'をどこのコントローラとアクションにマップするかを推測できないのでしょうか? – MrYoshiji

+0

@MrYoshiji - ええ、私は 'action_dispatch'ソースコードを見ていました。なぜなら、私は'任意の 'アサーションで少し不快だったからです。私はそれが不正確だと感じるので、その言葉を削除すると思います。 – jvillian

3

これはオプションは、メソッドに渡されることを可能にする一般的な方法です。

def do_something(subject, options = {}) 
    subject.perform_something 
    subject.perform_caching if options[:cache] 
    subject.send_report unless options[:skip_reporting] 
    # etc. 
end 

だから、あなたが呼び出すことができます:

something(some_object) 
something(some_object, cache: true) 
something(some_object, skip_reporting: true, cache: true) 

をあなたもこのようなデフォルト設定、設定することができます与えられた場合、デフォルトではありませんcacheオプションの場合ようにするため

def do_something_else(subject, options = {}) 
    options = { cache: true, skip_reporting: false }.merge(options) 
    subject.perform_something 
    subject.perform_caching if options[:cache] 
    subject.send_report unless options[:skip_reporting] 
end 

を次のようにそれはtrueになります。

1
get '/dashboard', to: 'dashboard#index', :as => 'dashboard' 

これは普通のメッセージではを送信する(あなたは「メソッド呼び出し」と呼んでいるものが、メッセージとメソッドはRubyで異なるものです、とメッセージを送信するのメタファーは本当に重要であることに注意してください)。 Rubyで

、あなたは、引数リストを囲む括弧を省略することが許可されています。だから、これはこれと同じです。また、selfことを暗示している場合にはメッセージ送信の受信機を除外するために許可されているので、これはこれと同じである

get('/dashboard', to: 'dashboard#index', :as => 'dashboard') 

メッセージ送信の最後の引数は Hashリテラルの場合 は
self.get('/dashboard', to: 'dashboard#index', :as => 'dashboard') 

、あなたは中括弧を省略することが許可されているので、これはこれと同じです。

self.get('/dashboard', { to: 'dashboard#index', :as => 'dashboard' }) 

の場合

今すぐ
self.get('/dashboard', { :to => 'dashboard#index', :as => 'dashboard' }) 

、それはただ退屈な古いメッセージを送るようには見えません:Hashリテラルのキーがあなたの代わり:key => valuekey: valueを書き込むことができ、これはこれと同じであるが、Symbolのですか?

これらの規則のほとんどは、より自然に見えるコードを記述できるようにするためのものです。例えば、物事は、Rubyでちょうど方法があり、他の言語でキーワードをなることなどattr_readerattr_writerattr_accessorrequireprivatepublicprotected、同様にそれはあなたが括弧を使用する必要があった場合には、奇妙な外観となりそこに受信機:

self.protected() 
def foo() end 
# instead of 
protected 
def foo() end 

# or 

self.private(def foo() end) 
# instead of 
private def foo() end 

あなたは周りの中括弧を省略することができますルールリテラルHashは、導入された後続のように、あなたでした「偽」キーワード引数:

def route(path, options = {}) end 
route(:index, :from => :here, :to => :there) 

さらにので、新しいスタイルの記号キーを持つ:ルビー2.0のように、Rubyはまた、後方互換性のためにHash末尾のよう正確を見て適切キーワード引数を、持っていることを

route(:index, from: :here, to: :there) 

def route(path, from:, to:, with: nil) end 
route(:index, from: :here, to: :there) # this line same as above 
関連する問題