要求された事例
ユーザのモデルはUserだが、ユーザ詳細画面のURLを /users/<user.id>
はいやだ! /people/<user.nickname>
にしたい!! Viewでのリンクもlink_to を使いたい!!!
解決方法
pathメソッドでのパラメータの渡し方がキモだった。
route.rb
Rails.application.routes.draw do
get '/people/:nickname' => 'users#show', as: :people
end
as: :people
の指定で people_path
メソッドが作られるので、link_toに渡せる。
users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find_by(:nickname => params[:nickname])
end
end
hoge.html.erb
<%= link_to people_path(nickname: user.nickname) %>
これで解決。
実際と戸惑い
ビューで毎回 people_path(nickname: user.nickname)
と書くにはD…
user.link_to
のようにメソッドチェーンにしたいけど、モデルに書いてはいけないような気がしたので、helperメソッドにした。
users_helper.rb
module UsersHelper
def people_link_to(user)
people_path(nickname: user.nickname)
end
end
こういった "データには関係ないのでモデルではないが、モデルにひもづいているhtml生成のメソッド"ってどこに書けばいいのか相変わらず謎。