web-dev-qa-db-ja.com

Rails routingのidパラメータを変更する

Ruby on Rails 3の新しいルーティングシステムを使用すると、デフォルトの:idパラメータを変更できます。

resources :users, :key => :username

次のルートが出てくる

/users/new
/users/:username
/users/:username/edit
...etc

上記の例は単純ですが、現在取り組んでいるプロジェクトで実行すると非常に役立つので、私は尋ねています。

このパラメーターを変更することはできますか?変更できない場合、変更できない理由はありますか?

42
joeellis

私があなたを正しく理解しているなら、あなたの望みはあなたのURLにusernameではなくidを含めることですよね?

これを行うには、モデルのto_paramメソッドをオーバーライドします。詳細は こちら で取得できます。

35
Ju Nogueira

あなたのルートで使用できます

resources :user, param: :username
65
Ujjwal Thaakar

Ruby on Rails 4.1.4(およびおそらく以前のバージョン))の場合、bothj .. および jjwal の提案:

1)config/routes.rbに以下を追加します:

resources :user, param: :username

2)app/models/user.rbに以下を追加します:

def to_param
  username
end

あなただけ#1を実行すると、rake routesからわかるように、すべてのルートが正しくなります。

$ rake routes
    Prefix Verb   URI Pattern                    Controller#Action
user_index GET    /user(.:format)                user#index
           POST   /user(.:format)                user#create
  new_user GET    /user/new(.:format)            user#new
 edit_user GET    /user/:username/edit(.:format) user#edit
      user GET    /user/:username(.:format)      user#show
           PATCH  /user/:username(.:format)      user#update
           PUT    /user/:username(.:format)      user#update
           DELETE /user/:username(.:format)      user#destroy

ただし、Userインスタンスに基づいてURLを構築するヘルパーメソッドは、URLにidを含めます。 /user/1。作成されたURLでusernameを取得するには、#2のように to_param をオーバーライドする必要があります。

28
Matt

FriendlyId gemはこれを手助けします。 Ryan Batesには、このgemの使用について優れた ビデオチュートリアル があります。

2
Trav McKinney

答えは質問者に受け入れられましたが、これを行う簡単な方法があります。このコードをコントローラーに記述します。

authorize_resource :find_by => :username

リンクを表示するビューで、このコードを記述します。

<%= link_to "Username", user_path(u.username) %>

ルートやコントローラーに他の変更を加える必要はありません。

PDATE:これは、CanCan gemを使用している場合にのみ機能します。

1
KULKING

パスヘルパーへの入力としてユーザー名を渡します。

あなたのビューコードで:

user_path(u.username) #/users/john

コントローラでは、受け取ったidusernameとして扱います。

def show
  user = User.find_by_username!(params[:id])
  ...
end
0
Harish Shetty