paramsとhidden_fieldを使っての、値の受け取り方について
実現したいこと
管理者ユーザーでログイン。
編集ぺージで一般ユーザーの更新処理をした後、編集したユーザーのトップページ(show_path)へリダイレクトするため、一般ユーザーのidを受け取りたい。
find_byでやると管理者ユーザーのidしか受け取れない。
これがなかなか上手くいかずハマりましたが実現出来たのでメモ。
ご指摘などあれば是非お願い致しますm(__)m
以下のコード。
def show
if current_user.id != params[:id]
@user = User.find(params[:id])←これが間違い
else
@user = User.find(current_user.id)
end
find_byでは1件しか取得出来ず、管理者ユーザーへ飛んでしまうので✖
思いつく限り試すが、シンボルは使えないというようなエラー。
@user = User.find(params[id: :user.id])
@user = User.find(params[id: @user.id])
先輩に聞いた結果、
「userのidを受け取るから、こうすればいいんじゃない?」とのアドバイス。
@user = User.find(params[:user][:id])
受け取れました。。
今回学んだこと
hidden_fieldで@userのidを取得し、form_forで渡す場合は、
コントローラー側のparamsで、「どのモデルの」「どの値なのか」を定義する必要がある。
今回の場合、[:user][:id]とする必要があった。
どのモデルのidなのか?を定義する必要があった。
idはビューから飛んでいたが、コントローラー側でidの受け取り先のモデルがなかった、
というような状態だった。
今回はidだったが、仮に年齢である[:age]を複数受け取りたい場合、findは使えない。
findはidのみを複数検索するため。
上記の場合はwhereメソッドを使うこと。
1件取得するだけで良いのであればfind_byメソッドを使う。
@user = User.find_by(params[:user][:age])とかにする。
かなりハマりましたが勉強になりました!
その後調べていると以下の記事でとてもわかりやすく書いてくださっていました。
f.hidden_fieldとhidden_field_tagの使い方【Ruby on Rails】
f.hidden_field :shampoo_id, value: shampoo.id
こちらの記述だと、コントローラーでparamsを使って引用する際には
params[:user][:email]に保存されます。
理由は、@userの、email属性に、valueで渡した値を格納しているからですね。
モデルのインスタンスの属性に格納しているのです。
Userのモデルのnameカラムや、emailカラム、それぞれに受け渡したい場合は、こちらを利用する必要があります。