デフォルトの識別子パラメータの名前を変更する方法“ id” Railsのmap.resources()に?
-
03-07-2019 - |
質問
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ではなくログインでユーザーを見つけることです。