1

有沒有辦法確保*_path方法識別自定義路線?未能通過* _path方法識別的導軌3自定義路線

我有一個資源,並在同一控制器的自定義路線:

resources :news, :only => [:index, :show], :path => :nieuws 
match '/nieuws/:cat/:id/:slug', :to => 'news#show' 
match '/nieuws/:id/:slug', :to => 'news#show' 

這是工作的罰款,並要求http://www.example.com/nieuws/category/1/slug時,它會顯示正確的新聞項目。問題是我想用news_path方法鏈接到我的新聞項目。要做到這一點我有下面的代碼添加到我的新聞產品型號:

def to_param 
    if news_category 
    "#{news_category.slug}/#{id}/#{slug}" 
    else 
    "#{id}/#{slug}" 
    end 
end 

當不使用/到單獨的貓,ID和蛞蝓它會正常工作,但使用/當news_path方法失敗,請求的頁面顯示:

No route matches {:action=>"show", :controller=>"news", :id=>#<NewsItem id: 1...etc 

rake routes輸出:

news_index GET /nieuws(.:format)    {:action=>"index", :controller=>"news"} 
news  GET /nieuws/:id(.:format)   {:action=>"show", :controller=>"news"} 
       /nieuws/:cat/:id/:slug(.:format) {:controller=>"news", :action=>"show"} 
       /nieuws/:id/:slug(.:format)  {:controller=>"news", :action=>"show"} 

我已經嘗試添加, :id => /[0-9]+\/.+/我的資源路徑的終點,這使得/的使用,但因爲它只是使用正則表達式,我無法從URL

因此得到:cat參數,是有辦法,以確保我的自定義路線被news_path方法識別?

回答

0

我認爲您使用to_param的方式不應該被使用。如果您有to_param方法,則還應該有一個from_param方法作爲查找程序,並且它應始終映射到令牌而不是路徑。即"#{news_category.slug}-#{id}-#{slug}"而不是"#{news_category.slug}/#{id}/#{slug}"

,如果你wan't由路徑段分開,你需要將它放入您的通話news_path像這樣:

news_path(news, :cat => news_category.slug, :slug => slug) 

看到更多奉勸指南:http://guides.rubyonrails.org/routing.html#segment-constraints

+0

感謝您的回答,但你給我的解決方案將產生一個看起來像這樣的鏈接:www.example.com/nieuws/2?cat = category&slug = slug'。我試圖達到的目標是:www.example.com/nieuws/category/2/slug或者www.example.com/nieuws/2/slug'。有沒有另一種方法來做到這一點,仍然使用'news_path'或是唯一的解決方案在我的模型中創建自己的url/path方法? – christiaanderidder

+0

您可以使用':as'選項製作命名路線,然後使用它們而不是'news_path'方法。 – phoet

+0

感謝您的回覆! – christiaanderidder