他ユーザーのtask編集ページへアクセスした場合は、自分のtask編集ページへリダイレクトさせたい
上記のようなアクセス制限をかけたい。
だが、link_toに指定しているedit_task_path(ユーザーのtask編集ページ)にcurrent_userのidを含める書き方がわからなかった。
現在は、AというユーザーがBというユーザーのtask編集ページへアクセスした場合、Aユーザーのtask詳細ページ(show_path)へリダイレクトさせているが、Aユーザーのtask編集ページを表示させてあげた方が親切。
このアクセス制限は、URLの直指定と変数展開を使うと実現出来たのでメモに残す。
ルーティング
get '/users/:id/edit_task'
getのURLにidを含める
ビュー
<%= link_to 'タスクを編集', "/users/#{current_user.id}/edit_task", params: { id: @user.id, task: @task }
link_toの遷移先URLを直指定する。
URL内のidは変数展開(文字列の中で変数を使うこと。""で囲んでさらにidを#{}でネストする)を使ってねじ込む。
ここが上手く書けていなかった。
もしこのURLの後にparamsを使って値をハッシュで渡す場合は、一旦「,」で区切って
params: { カラム: 値, カラム: 値 }
こういう書き方をするんだと勉強になった。
コントローラー
redirect_to "/users/#{current_user.id}/edit_task"
ビューと同じく、遷移先のURLを直指定する
_pathや_urlでは上手くいかなかったが、_pathや_urlは戻り値に上記のような相対パスや絶対パスを渡しており、やってることは一緒なので良い。
ちなみに
redirect_to controller: 'users', action: 'edit_task', id: current_user
でも意図した動作に出来ました。