QA@IT

RailsのRoutingにパラメータを設定する書き方は何ですか?

4289 PV

例:
ユーザーの resource は:

resources :users

routes は:

users GET    /users(.:format)                          users#index
POST   /users(.:format)                          users#create
new_user GET    /users/new(.:format)                      users#new
edit_user GET    /users/:id/edit(.:format)                 users#edit
user GET    /users/:id(.:format)                      users#show
PUT    /users/:id(.:format)                      users#update
DELETE /users/:id(.:format)                      users#destroy

ユーザー詳細は:
http://0.0.0.0:3000/users/1
もしこんなURLが欲しいであれば:
http://0.0.0.0:3000/users/allen
どうすればいいですか?

回答

対象となるモデルに

def to_param
  "#{id}-#{name}"
end

みたいなのを実装しておけば、URLは

http://0.0.0.0:3000/users/1-allen

となりますが、コントローラーで

@product = Product.find(params[:id])

もそのまま使えるはずです。

def to_param
  "#{name}"
end

とすると、

http://0.0.0.0:3000/users/allen

となってわかりやすいですが、コントローラーでは

@product = Product.find_by_name(params[:id])

みたいにする必要があり、nameをユニークにする必要があったりして、面倒ではあります。

編集 履歴 (0)
  • ご回答ありがとうございました。 -

allenという例だけなら、そのままparams[:id]で取れると思いますが、ドット(".")が入るかどうかがキモになってきます。(そのうしろに(.:format)という邪魔者がいるので、なにもしないとユーザが適当なドット入りのURLを叩くだけでわかりにくいエラーに遭遇します)

ドットも含めてとにかく多めにキャッチしたいなら、「後ろに続くスラッシュ("/")以外の文字」を受け入れればよいので、

resources :users, constraints: { id: /[^\/]+/ }

などと書けばよいと思います。

編集 履歴 (2)
  • ご回答ありがとうございました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。