動的なparamsスロットを変更する方法を調べてみたところ、正確なことを行うこの投稿が見つかりました。投稿は https://thoughtbot.com/blog/Rails-patch-change-the-name-of-the-id-parameter-in
基本的にそれがすることは、以下がルートである場合です:
map.resources :clients, :key => :client_name do |client|
client.resources :sites, :key => :name do |site|
site.resources :articles, :key => :title
end
end
これらのルートは次のパスを作成します。
/clients/:client_name
/clients/:client_name/sites/:name
/clients/:client_name/sites/:site_name/articles/:title
1つの解決策は、モデルのdef to_param
メソッドをオーバーライドすることですが、モデル自体に触れずにこれが必要です。
しかし、for Rails 2.xなので、Rails 3?
更新
このアプリはMongoidを使用しています。 ARではありません。そのため、ジェムフレンドリーは使用できません。
Rails 4では、:param
オプションが追加されました。これは、まさにあなたが探していることをするようです。 Rails 4コード と比較して Rails 3コード を見ることができます。
routes.rb
ファイルにこれを簡単に実装できます:
# config/routes.rb
resources :posts, param: :slug
# app/controllers/posts_controller.rb
# ...
@post = Post.find_by(slug: params[:slug])
# ...
Rails 4のリリース時点で、この機能は Railsガイドに記載されています です。
残念ながら、Rails 3では、resources
の:key
オプションが削除されたため、追加のオプションを渡すだけでは、この方法で作成されたルートの名前を簡単に変更できません。 。
過去1年間で既に何らかの形でアプリケーションが望みどおりに動作していると思いますが、Rails 3 in routes.rb
で説明している効果を得る方法に進みます。 to_param
メソッドよりも少し多くの作業が必要です。 scope
およびmatch
を使用して定義されたルートにカスタムパラメーターを定義できます(または、そのいとこget
、put
、post
、およびdelete
) 。マッチャーに必要なパラメーター名を入力するだけです。
get 'clients/:client_name', :to => 'clients#show', :as => client
scope 'clients/:client_name' do
get 'sites/:name', :to => 'sites#show', :as => site
end
resources
が自動的に作成するすべてのルートを手動で追加する必要がありますが、探しているものを実現できます。 :controller
オプションをscope
および追加のscope
ブロックとともに効果的に使用して、繰り返しの一部を取り除くこともできます。
EDIT(2014年5月8日):回答にRails 3&4.の両方の情報が含まれていることを明確にするより長い期間動作するように、コードに正確な行番号とコミットに移動します。
EDIT(2014年11月16日):Rails 4が最上位になり、現在のバージョンであるため関連情報を含める必要がありますRails of of nowかなり長い間。
EDIT(2016年8月9日):ソリューションがRails 5でも機能することを反映し、古いリンクを更新します。
in Rails 4、paramオプションを渡して:idパラメータを変更します。たとえばresources :photos, param: :photo_name
は/ photos /:photo_nameを生成します
すべてのための宝石があるように、そのための宝石があります;)
私はRails 3.のこのような動作に FriendlyId を使用しています。
ただし、次のようにモデルにコードを追加する必要があります。
class Client < ActiveRecord::Base
has_friendly_id :name
end
...また、クライアントにURI互換の名前がない場合は、has_friendly_id :name, :use_slug => true
で実行できるスラッグを使用できます。ナメクジを使用するときは、明らかにデータベースにも永続化する必要があります。
すでに述べたように、to_param
トリックをRails 3、文書化された here で使用できます) 。しかし、FriendlyIdはもう少し汎用性が高いと思います。
私があなたを正しく理解しているなら、あなたが望むのは、あなたのURLにid
の代わりにclient_name
を持つことです。
モデルでto_param
メソッドをオーバーライドすることで、これを行うことができます。詳細情報を取得できます here .
Rails 3では、次のような名前空間とスコープの組み合わせを使用してIDキーの名前を変更できます(ただし、あまり良くありません):
namespace :clients do
scope "/:client_name" do
namespace :sites do
scope "/:name" do
post "/:title" => "articles#create"
...
end
end
end
end