Ruby on Rails 3の新しいルーティングシステムを使用すると、デフォルトの:idパラメータを変更できます。
resources :users, :key => :username
次のルートが出てくる
/users/new
/users/:username
/users/:username/edit
...etc
上記の例は単純ですが、現在取り組んでいるプロジェクトで実行すると非常に役立つので、私は尋ねています。
このパラメーターを変更することはできますか?変更できない場合、変更できない理由はありますか?
私があなたを正しく理解しているなら、あなたの望みはあなたのURLにusername
ではなくid
を含めることですよね?
これを行うには、モデルのto_param
メソッドをオーバーライドします。詳細は こちら で取得できます。
あなたのルートで使用できます
resources :user, param: :username
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
をオーバーライドする必要があります。
FriendlyId gemはこれを手助けします。 Ryan Batesには、このgemの使用について優れた ビデオチュートリアル があります。
答えは質問者に受け入れられましたが、これを行う簡単な方法があります。このコードをコントローラーに記述します。
authorize_resource :find_by => :username
リンクを表示するビューで、このコードを記述します。
<%= link_to "Username", user_path(u.username) %>
ルートやコントローラーに他の変更を加える必要はありません。
PDATE:これは、CanCan gemを使用している場合にのみ機能します。
パスヘルパーへの入力としてユーザー名を渡します。
あなたのビューコードで:
user_path(u.username) #/users/john
コントローラでは、受け取ったid
をusername
として扱います。
def show
user = User.find_by_username!(params[:id])
...
end