web-dev-qa-db-ja.com

Railsのルーティングリソースの:idパラメーターの名前を変更します

動的な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ではありません。そのため、ジェムフレンドリーは使用できません。

99
Autodidact

Rails 4および5

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

残念ながら、Rails 3では、resources:keyオプションが削除されたため、追加のオプションを渡すだけでは、この方法で作成されたルートの名前を簡単に変更できません。 。

詳細

過去1年間で既に何らかの形でアプリケーションが望みどおりに動作していると思いますが、Rails 3 in routes.rbで説明している効果を得る方法に進みます。 to_paramメソッドよりも少し多くの作業が必要です。 scopeおよびmatchを使用して定義されたルートにカスタムパラメーターを定義できます(または、そのいとこgetputpost、および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でも機能することを反映し、古いリンクを更新します。

182
joshhepworth

in Rails 4、paramオプションを渡して:idパラメータを変更します。たとえばresources :photos, param: :photo_nameは/ photos /:photo_nameを生成します

43
bobzsj87

すべてのための宝石があるように、そのための宝石があります;)

私は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はもう少し汎用性が高いと思います。

1
Frost

私があなたを正しく理解しているなら、あなたが望むのは、あなたのURLにidの代わりにclient_nameを持つことです。

モデルでto_paramメソッドをオーバーライドすることで、これを行うことができます。詳細情報を取得できます here .

1
Mohit Jain

Rails 3では、次のような名前空間とスコープの組み合わせを使用してIDキーの名前を変更できます(ただし、あまり良くありません):

namespace :clients do
  scope "/:client_name" do
    namespace :sites do
      scope "/:name" do
         post "/:title" => "articles#create"
         ...
      end
    end
  end
end
0