【Rails】paramsについて徹底解説!

Rails

paramsとは

フォームなどによって送られてきた情報(パラメーター)を取得するメソッドです。
送られてくる情報には下記の2つがあります。
・投稿フォームなどPOSTで送信されたデータ
・検索フォームなどGETで送信されURLにクエリとして入るデータ

例えて考えてみよう
リンクをコピーしました

投稿フォームで入力された情報は次のアクションに送られるためダンボールに入れられるイメージをするとわかりやすいです。
その際キーとバリューのセットになってダンボールに入ります。

名前: プログラマン
メールアドレス: puroguraman@hoge.com

名前は「name」カラムに、メールアドレスは「email」というカラムに保存されるとします。
するとこれらのパラメーターは次のような形で次のアクションへ送られます。

{name: "プログラマン", email: "puroguraman@hoge.com"}

ではどのような流れでこれらのパラメーターは次のアクションへ送られるのでしょうか?

投稿フォームの情報の流れ
リンクをコピーしました

みなさんが何かを宅急便で送るとき、どのようにして送りますか?
送りたいものをそのままの形で送る人はそうはいないですよね。
箱とか袋に入れて送ると思います。

railsで投稿フォームの内容を次のアクションへ渡すときも同じように箱のようなものに入れて送ります。
newアクションで投稿フォームに入力された情報はダンボールに入り、createアクションへ渡されるイメージをするとわかりやすいです。
※あくまでイメージです

パラメーターがダンボールに入ってcreateアクションへ渡されました。
ですがcreateアクションはダンボールに入ったままではデータベースに保存できません。
データベースへ保存するためには入力された情報をダンボールから取り出さなくてはなりません。

その時に使うメソッドがparamsです。
paramsメソッドを使うと投稿フォームに入力された情報をダンボールから取り出すことができます。

取り出す際の注意点
リンクをコピーしました

paramsを使って値を取り出す際に気をつけることがあります。
それはダンボールには投稿フォームで入力された情報以外のものも自動で入ってしまうことです。
どういう情報が入るかはこのあと実際のアプリを使って確認します。

ダンボールには登録された情報がキーとバリューのセットで入っています。
それらの情報をデータベースに保存するメソッドがcreateメソッドです。

createメソッドは引数にキーとバリューのセットの情報を渡します。
paramsで取得した情報はその状態になっているため、User.create(params)みたいにしてあげれば投稿フォームの情報を保存することができます。

ただしこれではセキリュティに関して非常に問題があります。
ですのでストロングパラメーターといった物を使います。
paramsには投稿フォームで入力した情報以外のものも入っていると説明しました。
なのでcreateメソッドの引数に直接paramsを渡すには非常に危険です。

それではどのようにしたら良いのでしょうか?

permitメソッド
リンクをコピーしました

paramsを使ってダンボールから情報を取り出した後、データベースに保存したいパラメーターをピックアップする必要があります。
それを可能にするのがpermitメソッドです。

paramsに対してpermitメソッドを使い、その引数に取り出したいカラムを指定するとダンボールから出したパラメーターの中でデーターベースに保存したいものだけを取り出すことができます。

ruby
1
params.permit(:name, :age)

上のように書くとダンボールからnameカラムとageカラムに保存する情報だけを取り出すことができます。
詳しくはストロングパラメーターの記事を参照して下さい。

実際のアプリでparamsを確認してみよう
リンクをコピーしました

それでは実際にアプリの中でparamsを使いパラメーターを取得してみましょう。
下記のコマンドを順に実行してみましょう。
①git clone -b params https://github.com/miyagit/programan_dojo.git

② cd programan_dojo

③ bundle install
→ rbenv: version ‘2.4.1’ is not installed と表示された場合は、ruby -v と実行してください。

ruby -vと実行し出てきたversion(例: 2.3.1)と出てきたら、

vim .ruby-versionとし、
ruby -vで出てきた値(例: 2.3.1)に書き換えてください。

続いてvim Gemfileとし、ruby 2.4.1と書いてある部分をruby -vで出てきた値(例: 2.3.1)に書き換えてください。

④ rails db:create && rails db:migrate && rails db:seed

環境構築が完了しました。と表示されると、
本当にrails applicationが動作するかrails sコマンドで起動しましょう。

rails sを起動し、ブラウザでlocalhost: 3000と入力して下記のような画面が出てくれば環境構築完了です!

環境構築

paramsの中身を確認してみよう
リンクをコピーしました

それでは実際にフォームに投稿された情報がどのようにparamsに入っているか確認してみましょう。
今回はbinding.pryを使いデバッグをしてみます。

binding.pryを使うには「pry-rails」というgemが必要です。
今回はすでにGemfileに追加してあります。

createアクション内にbinding.pryを追記しよう
リンクをコピーしました

usersコントローラのcreateアクション内にbinding.pryを追記します。
下記のように編集してください。

ruby
1
2
3
4
5
    def create
        User.create(user_params)
        binding.pry
        redirect_to root_path
    end

ではトップページのユーザー登録のリンクから投稿フォームへ行き、投稿をしてみましょう。
createメソッドの次の行にbinding.pryを記述したので、送信ボタンを押すとページ遷移されず画面が止まります。
サーバーを立ち上げたコンソールを確認してみましょう。

binding.pry
このようにコンソールモードになり、コマンドが打てるようになっています。
ここで「params」と入力するとパラメーターを確認することができます。

params
このようにキーとバリューのセットでパラメーターが取得できました。
取得できたものを見るとわかるように今回はform_forを利用してフォームを作成したので、ハッシュの中にuserのバリューでハッシュが入っているのが確認できます。

それではこの中のハッシュを取り出してみましょう。
ターミナルで「params.require(:user)」と打ち込んでください。

params.require
するとこのようにパラメーターが取得できました。
データを保存する時はusersコントローラーのストロングパラメーターでuser_paramsというメソッドを作成し、その返り値をcreateメソッドの引数に当てます。

この時createメソッドの引数はハッシュ形式でなければなりません。
paramsは上のようにキーとバリューのセットになっているので、引数で渡してあげればしっかりとデータベースに保存されるというわけです。

上のようなストロングパラメーターを作成している場合、nameのバリューを取得したい時にはuser_params[:name]と、heightのバリューが取得したければuser_params[:height]とすれば取得できます。

URLにクエリを確認してみよう
リンクをコピーしました

投稿フォームからcreateアクションへリンクする際にhttpメソッドはPOSTでした。
POSTで送信されたデータは上のように取得できますが、GETで送られた時はどうなるでしょう。

検索フォームのようにGETで送られたデータはURLにクエリ文字列という形で送られます。
トップページの検索フォームに「programan」と入力し「検索」ボタンを押してください。

検索
するとURLが下のようになっているのが確認できるはずです。

URL
「?」が以降がクエリ文字列です。

クエリ文字列とは
リンクをコピーしました

クエリ文字列(URLパラメーター)はサーバーに情報を送るためにURLの末尾につける文字列のことです。
その後に続く文字は「"パラメーター"="値"」になります。
複数ある場合は「&」で繋ぎます。

上の例だと「utf8=✓」と「keyword=programan」の2つのクエリ文字が指定されていることになります。
「utf8=✓」はform_tagでフォームを送信すると自動でつくクエリ文字で、「keyword=programan」となっている部分の「keyword」はビューの「input type="text" name="keyword"」で指定したためです。
この時、paramsを使うと「utf8: "✓", keyword: "programan"」という形でパラメーターを取得できます。

今回は検索のキーワードで「programan」が必要なのでコントローラーのアクション内ではparams[:keyword]と指定しているわけです。

このようにGETで送信された情報はURLに入って送られると覚えておきましょう。

まとめ

フォームなどによって送られてきた情報(パラメーター)はparamsというメソッドで取得できると覚えておきましょう!