2009-05-01 5 views
12

私はRailのmap.resourcesによって生成されるすべてのデフォルトルートが好きです。しかし、私のルートに数字以外の識別子を使用したい場合があります。ネストされたルートは、ユーザーとその記事で構成されている場合たとえば、標準的なルートは、次のような記述できます。Railsのmap.resources()でデフォルトの識別子param "id"の名前を変更するには?

map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id' 

しかし、Railsのことで生成されるデフォルトの数値識別子を使用しない多くの利点/理由があります。デフォルトの:idパラメータを別の標準的な識別子に置き換える方法はありますか?すべての標準アクションのカスタムルートを作成することはありませんか?私は次の形式でルートをしたい場合は言う:

'/users/:login/articles/:id' 

は達成可能map.resourcesを使用してルートのこの種のですか?

+0

p.s.私はMerbのルーティングシステムがこの能力を持っているので主にこれを尋ねます。 – newtonapple

答えて

13

Rails 2.3以降、パラメータ名を変更することはできませんが、#resourcesが提供する自動ルーティングは引き続き使用できます。回避策として

、あなたが:path_prefix:name_prefixarticlesをマッピングすることができます

map.resources :articles, :path_prefix => "https://stackoverflow.com/users/:login", 
         :name_prefix => "user_" 

:path_prefixは、URLに影響を与え、そして:name_prefixは、生成された名前のルートに影響を与えますので、あなたはこれらのルートになってしまいます。

user_articles GET /users/:login/articles(.:format)   {:controller=>"articles", :action=>"index"} 
        POST /users/:login/articles(.:format)   {:controller=>"articles", :action=>"create"} 
new_user_article GET /users/:login/articles/new(.:format)  {:controller=>"articles", :action=>"new"} 
edit_user_article GET /users/:login/articles/:id/edit(.:format) {:controller=>"articles", :action=>"edit"} 
    user_article GET /users/:login/articles/:id(.:format)  {:controller=>"articles", :action=>"show"} 
        PUT /users/:login/articles/:id(.:format)  {:controller=>"articles", :action=>"update"} 
        DELETE /users/:login/articles/:id(.:format)  {:controller=>"articles", :action=>"destroy"} 

一般的な経験則として、しかし、私はあなたがあなたの質問に投稿されたルーティングと、:user_idのRailsのデフォルトの規則に固執したいです。 :id:user_idは必ずしも「数値識別子」を意味するものではなく、「リソース識別子」を意味するものであれば何でも構いません。また、デフォルトの規約に従うことで、Railsでリソースルートを使用している人にとっては、コードを理解しやすくなります。

リソースに数値以外の識別子を使用するには、モデル内で#to_paramを再定義するだけです。次に、User#find_by_login!のように、このID(数字のIDではなく)で検索するファインダーをコントローラーで使用してください。

+0

+1:非常によく書かれた答え。 –

11

モデルのto_paramをオーバーライドすることで、URLのIDを使用するデフォルトを変更できます。例えば

class User < ActiveRecord::Base 
    def to_param 
    login 
    end 
end 

user_articles_path(@user) => "https://stackoverflow.com/users/:login/articles" 

変更する必要があるのは、コントローラのIDではなくログインするだけです。

+0

to_paramは経路生成の試行を行います。しかし認識では、それはまだuser_idとして渡されます。名前を変更する場所はありますか?ログインしますか? – newtonapple

+0

これは別の質問に対するよく書かれた答えです:/ここでの質問はルータと ':id'ルートパラメータの名前を変更する方法です。 – Matchu

関連する問題