12

Railのmap.resourcesによって生成されるすべてのデフォルトルートが好きです。ただし、ルートで数値以外の識別子を使用したい場合があります。たとえば、ネストされたルートがユーザーとその記事で構成されている場合、標準ルートは次のように記述できます。

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

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

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

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

4

2 に答える 2

13

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

articles回避策として、 a:path_prefix:name_prefix:を使用してマップできます。

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

:path_prefixURLに: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は、モデルで再定義するだけです。次に、コントローラーで、(数値IDではなく)この識別子で検索するファインダーを使用してくださいUser#find_by_login!

于 2009-05-03T00:05:30.800 に答える
12

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

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

user_articles_path(@user) => "/users/:login/articles"

他に必要な変更は、コントローラーのIDではなくログインでユーザーを検索することだけです。

于 2009-05-01T10:18:35.103 に答える