更新日:
【Rails】 paramsって一体何?使い方を徹底解説!
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
を追記します。
下記のように編集してください。
1
2
3
4
5
def create
User.create(user_params)
binding.pry
redirect_to root_path
end
ではトップページのユーザー登録のリンクから投稿フォームへ行き、投稿をしてみましょう。
createメソッドの次の行にbinding.pry
を記述したので、送信ボタンを押すとページ遷移されず画面が止まります。
サーバーを立ち上げたコンソールを確認してみましょう。
このようにコンソールモードになり、コマンドが打てるようになっています。
ここでparams
と入力するとパラメーターを確認することができます。
このようにキーとバリューのセットでパラメーターが取得できました。
取得できたものを見るとわかるように今回はform_forを利用してフォームを作成したので、ハッシュの中にuserのバリューでハッシュが入っているのが確認できます。
それではこの中のハッシュを取り出してみましょう。
ターミナルでparams.require(:user)
と打ち込んでください。
するとこのようにパラメーターが取得できました。
データを保存する時は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の末尾につける文字列のことです。
その後に続く文字は"パラメーター"="値"
になります。
複数ある場合は&
で繋ぎます。
上の例だと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とは、フォームなどによって送られてきた情報(パラメータ)を取得するメソッドのこと
- 必要な情報以外も取得することが出来てしまうので、データベース操作を伴う場合はストロングパラメータが必須!