2013-08-24 71 views
2

我幾乎可以肯定有人問過這個問題,但我似乎無法找到正確的一系列單詞來找到它。導軌路由 - 添加自定義路由

我有一個資源,遊戲,所有正常的資源-y路徑。創建,編輯等

我在GamesController中創建了一個名爲json的新動作,我希望能夠在mydomain.com/games/json上訪問,但路由不斷拾取'json'作爲ID並且改爲將其路由到「顯示」操作。

據推測,這是因爲缺省路由:

match ':controller(/:action(/:id))' 

我已經嘗試了一些事情,但是不管我做什麼,它使路由到「節目。」我一直試圖找出使用this guide,但對於那些對軌道非常陌生的人來說,它很適合採用和應用。

我想說,任何控制器/ JSON會帶你到JSON動作(而不是顯示id'JSON'),但我會解決必須爲每個控制器單獨指定它。

任何幫助,非常感謝。 (即使這只是指向我已經回答的問題。)在所有情況下,我一直在將我嘗試創建的路線放置在默認路線之上。

我的路線:

root :to => 'home#index' 
    resources :events, :players, :sets, :matches, :characters, :videos, :games, :event_instances, :game_instances 
    resource :user_session 
    resource :account, :controller => "users" 
    resources :users 
    match '/login', :to => 'user_sessions#new', :as => 'login' 
    match '/logout', :to => 'user_sessions#destroy', :as => 'logout' 
    match '/register', :to => 'users#create', :as => 'register' 
    match '/games/json', :to => 'games#json', :as => 'gameList' 
    match ':controller(/:action(/:id))' 
+0

你可以請你出示你的路線嗎?我們需要它來有效地回答。 – NicoArbogast

+0

大概應該知道。他們已被添加。 –

+0

謝謝,我已經回答了你的問題,我認爲 – NicoArbogast

回答

0
resources :games do 
    collection do 
    get :json 
    end 
end 

,如果你也想補充一點,將採取:id路徑段和返回,也就是說,一個特定遊戲的JSON表示的動作,你會做到這一點與

resources :games do 
    collection do 
    get :json 
    end 
    member do 
    get :json 
    end 
end 

我會補充說,當我是Rails的新品牌時(不到1.5年前),由於某種原因,路由DSL對我來說真的很難。但是,值得研究這個指南,儘管起初它有點壓倒性。否則,你最終會得到一堆match '/route/to/somewhere' => 'controller#action', :as => :some_helper,這最終會讓你很難讀取&,並且會讓你的網站難以獲得一致的「語法」。

編輯:看看你現在發佈的路由文件,問題是你申報resources :games後聲明games/json路由。路由匹配優先級從文件頂部開始向下,所以games的資源路由首先匹配,並且從不檢查稍後聲明的特定路由。如果您使用上面的語法使您的json路由資源聲明的一部分,這不會發生。

+0

Spot on。 當你不確定你在找什麼時,很難找到答案。 非常感謝。 (在我指導的那一節中,我認爲它有很多意義,因爲它有一些背景知識。) –

+0

cf. NicoArbogast的答案。他的策略會爲所有資源控制器定義一個'json'路由,這可能是你想要的行爲。 (我仍然會親自使用'get'而不是'match'。) – gregates

+0

你是正確的。我完成了我的答案。謝謝 – NicoArbogast

2

好,所以你需要做的就是把你上面的其他資源路線自定義JSON的路線,並使其默認像這樣的內容:

get '/:controller/json(/:id)', action: 'json' 
resources :events, :players, :sets, :matches, :characters, :videos, :games,   :event_instances, :game_instances 
... 

你的困惑是有聯繫到路線建立和網址解析的方式

將您的routes.rb文件看作一組連續的過濾器,以便將其應用於客戶端請求的url。

如果您將默認路由放在另一個上面,它會捕獲所有匹配給定模式的請求=>這意味着當您在json路由上添加所有資源路由時,所有匹配/#{resources}/:id模式(和/ games/json就是其中之一)在它們到達json自定義路由之前被捕獲。

通過將高於其他定製的路線,你把它抓到匹配模式的任何請求,在這種情況下,這意味着所有的請求

/#{controller_name or resource_name)}/json(/:id) 

NB:

我不是很確定這是用於路由的最佳設計模式,我寧願使用基本的CRUD操作來使用傳統的REST路由,這些操作將執行respond_to模式來回答特定的json請求。

見文檔此:http://apidock.com/rails/ActionController/MimeResponds/InstanceMethods/respond_to

添加上你所有的資源之上,例如「所有」路由時,你的應用程序的增長可能會變得危險。

但你可能有你的理由去這種方式,在這種情況下,我認爲我的答案符合你的需要。