【Rails】paramsがなんなのかやっとわかった!
こんにちは、マリンです。
Railsでform
とか使っていれば当然params
って出てきますよね。
恥ずかしながら、このparams
の認識が違っていたために職場でかなり苦労しました。
やっと見えてきたのでまとめようと思います。
*内容に間違いや補足などございましたら、是非ともご指摘ください!
paramsとは?
params
メソッドとは、URLから送られてくる情報を受け取るメソッドです。
初っ端ですが、私の認識はここが間違っていました。
DBのレコードが持つ情報やカラムに紐付いた情報を表していると思っていました。
なんでこんな誤解が生まれたかはちょっと謎ですが・・・
まぁ、教材を流し読みしたせいだと思います。
とにかく、param
はURLからの情報を受け取るメソッド。
このことがわかれば、これまで職場で???となっていた全ての現象の辻褄が合いました。
paramsで受け取れるもの
formの値
まずは言わずと知れたform
から送られてくる値ですね。
<%= form_for @user do |f| %> <%= f.text_field :name %> <% end %>
@user = User.find_by(name: params[:name])
form_for
で入力された:name
を元にユーザーを探し出してます。
ここまでは良かったのですが、これがform_tag
に成った時に一気に躓きました。
<%= form_tag hoge_hoge_path do %> <%= password_field_tag 'password_text', ' ' %> <% end %>
@password = params[:password_text]
ただ入力されたパスワードを変数に入れてるだけなんですけど、
私はparams
で扱えるのがDBのカラムにあるものだけだと思っていたので、
ここで混乱するわけですね。
「password_textなんてカラムないけど!?」と。
なんともお恥ずかしい話です。
何はともあれ、URLからの値を受け取るので当然このように使用することが可能です。
クエリパラメータ
クエリパラメータとはURLに付け加えられたページの情報です。
http://hogehoge/hugahuga/hello?name=marin
この?
以降がクエリパラメータです。
params
ではこの値も受け取ることができます。
この場合はlink_to
からの値ということになると思います。
<%= link_to "marin", hogehoge_hugahuga_path(name: 'marin')
@user = User.find_by(name: params[:name])
こんな感じでしょうか。
番外 〜ストロングパラメータ〜
なんか悪い人からの攻撃に対応するために扱う値を制限するってやつですね。
チュートリアルとかでもやってるんですが、多分ここが私の誤解の原点ではないかと思います。
params.require(:user).permit(:id, :name, :email)
こんな感じのやつですね。
users
テーブルのid``name``email
は扱えますよと言っています。
(多分ここでテーブルに関連する値しかparams
は使えないと勘違いしたのではと)
大体の場合は
def hugahuga @user = params(user_params) end private def user_params params.require(:user).permit(:id, :name, :email) end
という感じで使うのではないでしょうか?
まとめ
そういえば、form
ではhidden_field
なんてのに渡した値を取得する場面もありました。
自分のどこが理解できていなかったのか?何を間違えているのか?
それがわかれば本当はもっと簡単にコードが読めるのかもしれません。。。
わからない時には一度立ち止まって、
つまづいている部分がどこなのかを見極めるのも大事ですね。