すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Rails

【Rails】 paramsって一体何?使い方を徹底解説!

ぴっかちゃん
ぴっかちゃん

paramsとは、フォームなどによって送られてきた情報(パラメーター)を取得するメソッドです。

binding.pryでparamsの表示画像

送られてくる情報には、「投稿フォームなどPOSTで送信されたデータ」と「検索フォームなどGETで送信されURLにクエリとして入るデータ」があります。

paramsの使い方

この章ではparamsの使い方について解説します。

送信されるパラメータ

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

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

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

送信されるパラメーター
1
{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メソッドです。

permitメソッドpermitメソッドを使ってストロングパラメーターにしようの記事に更に詳しく解説してあります。

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

コントローラー
1
params.permit(:name, :age)

上のように書くとダンボールからnameカラムとageカラムに保存する情報だけを取り出すことができます。

詳しくはストロングパラメーターの記事を参照して下さい。

実際のアプリでparamsを確認してみよう

この章では、アプリケーションを使ってparamsについて解説します。手を動かしながら進めることが出来るので、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に追加してあります。

ぴっかちゃん

実際の開発現場でも役に立つRuby on Railsの知識を学びたい方は、こちらの書籍がおすすめです。

createアクション内にbinding.pryを追記しよう

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

users_controller.rb -->
1
2
3
4
5
    def create
        User.create(user_params)
        binding.pry
        redirect_to root_path
    end

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

サーバーを立ち上げたコンソールを確認してみましょう。

binding.pryで止めた画像

このようにコンソールモードになり、コマンドが打てるようになっています。
ここで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とは、フォームなどによって送られてきた情報(パラメータ)を取得するメソッドのこと
  • 必要な情報以外も取得することが出来てしまうので、データベース操作を伴う場合はストロングパラメータが必須!