デフォルトの識別子パラメータの名前を変更する方法“ id” Railsのmap.resources()に?

StackOverflow https://stackoverflow.com/questions/810385

質問

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

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

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

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

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

役に立ちましたか?

解決

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

回避策として、:path_prefix および:name_prefix

articles をマッピングできます。
map.resources :articles, :path_prefix => "/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ではなく)で検索するファインダーを使用するようにしてください。

他のヒント

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

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

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

行う必要がある他の唯一の変更は、コントローラーのIDではなくログインでユーザーを見つけることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top