本記事では、Ruby on Railsにおける「paramsメソッド」について解説します。
paramsメソッドはユーザーから送信された情報を扱うための仕組みです
この記事を読むとRailsのparamsの基礎的な使い方を学べます。
paramsとは
Ruby on Rails においてparams
メソッドは HTTP リクエストに含まれるパラメータを扱うためのメソッドです。
具体的には、ユーザーがフォームを送信したとき、そのフォームで入力された値やURLのクエリ文字列で渡された値などが params
メソッドでハッシュオブジェクトとして取得できます。

paramsの使い方
paramsメソッドはコントローラー内での使用が多いです。コントローラーはHTTPリクエストを処理する役割を持っているためです。
paramsメソッドの戻り値はハッシュと同様にアクセスできます。 以下の形式でパラメータを取得します。
params[キー]
例えば、以下のHTMLのようなログインフォームを考えます。
<form action="/login" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="ログイン">
</form>
上記フォームで送信される値はparamsメソッドで以下のような「name属性=>ユーザ入力値」のハッシュとなります。
{
"username" => "ユーザ入力値",
"password" => "ユーザ入力値",
...
}
inputタグのname属性がキーとなり、ユーザの入力値はキーに対する値となります。
そのため入力されたユーザー名とパスワードを取得する場合は、以下のように書きます。
def login
username = params[:username]
password = params[:password]
# ユーザー認証処理
end
またパラメータがネストすることもあります。
{
"post" => {
"title" => "タイトル",
"content" => "本文"
}
}
Railsでフォームなどを作成すると上記のような入れ子になったパラメータになり、以下のようにアクセスできます。
params[:post][:title]
params[:post][:content]
URLクエリ文字列とparams
URLに含まれるクエリ文字列から取得する場合にparamsを使用します。
URLクエリ文字列は、URLの末尾の?以降追加されるパラメータであり&区切りで記述されています。
例えば、以下のようなクエリ文字列を持つURLを考えます。
http://example.com/search?q=ruby&sort=desc
このURLから、qの値とsortの値を取得する場合は、以下のように書きます。
def search
keyword = params[:q] # "ruby" という文字列が入る
sort = params[:sort] # "desc" という文字列が入る
# 検索処理
end
フォームと params
フォームから送信された場合はそのフォーム内のinputタグなどのname属性がキーとなってデータ送信されます。
例えば以下のようなフォームを考えます。
<%= form_for @article do |f| %>
<%= f.text_field :title %>
<%= f.text_area :content %>
<%= f.submit 'Create' %>
<% end %>
このERBを実行すると以下のようなHTMLとなります。
<form action="/articles" method="post">
<input type="text" name="article[title]">
<textarea name="article[content]"></textarea>
<input type="submit" value="Create">
</form>
このフォームから送られるリクエストでparamsメソッドで取得できるハッシュは以下の形式となります。
{
"article" => {
"title" => "ユーザが入力した値",
"content" => "ユーザが入力した値"
}
...
}
article[title] のような形式のname属性で送信すると、Railsは上記のようなネスト構造に分解して解釈します。
そのため、上記フォームから送信されたタイトルとコンテンツを取得する場合は、以下のように書きます。
def create
title = params[:article][:title] # f.text_field :title にユーザが入力した値
content = params[:article][:content] # f.text_area :content にユーザが入力した値
# 記事の作成処理
end
ルーティングと params
ルーティングで指定したパラメータを取得する場合はparamsを使用します。
例えば、以下のようなルーティングを考えます。
get '/articles/:id' => 'articles#show'
ルーティングでは:idのような形式はパラメータを表し、可変です。
上記ルーティングの場合は例えば /articles/1 のようなパス(URLの場合は https://〜.com/article/1 など) にマッチします。
/articles/1 の場合は :id の部分が 1 に該当します。
このような場合は params の値は以下の様なハッシュとなります。
{
"id" => 1,
...
}
そのため以下のように :id の値を取得できます。
def show
article_id = params[:id] # /articles/1 の場合は 1 が入っている
# 記事の表示処理
end
binding.pryを使ってparamsの値を確認する
コントローラー内でparamsを使用する際、どのような値が渡されているか確認するために、binding.pryを活用できます。
binding.pryの導入方法や活用方法は以下の記事を参照してください。
≫ 【Rails】pry-byebug(binding.pry)で効率よくデバッグ!インストールから使い方・Tipsまで
確認したいアクションの先頭にbinding.pryを記述します。
def update
binding.pry # この行で処理が停止する
...
end
binding.pryによってアクションが実行されたときに処理が一時停止し、その時点でのparamsの値を確認できます。
送信元のフォームは以下の様なerbで作成しました。
<%= form_with(model: @post) do |f|
<%= f.text_field :title %>
<%= f.text_area :content %>
<%= f.submit "投稿" %>
<% end %>
生成されたHTMLは以下の通りです。
<form action="/posts/1" method="patch">
<input type="text" name="post[title]" ...>
<textarea name="post[content]" ...>...</textarea>
<input type="submit" value="投稿">
</form>
このフォームからの送信時のアクションでparamsの値を確認すると以下のようになります。
[1] > params
params
=> #<ActionController::Parameters {
// 省略...
"post"=>{"title"=>"タイトル", "content"=>"本文"},
"commit"=>"投稿",
// 省略...
"id"=>"1"}
permitted: false>
本来は一行で表示されますが、上記の例はわかりやすさのために整形しています。
動作確認やデバッグなど細かく動作を確認したい場合は、まずparamsでどのような値が送られてきているのかを確認するのが定石です。 ぜひbinding.pryをつかって確認する方法をマスターしてください。
Strong Parameter
Strong ParameterはRails 4以降で導入された機能です。Strong Parameterはparamsを安全に操作するための仕組みであり、不正なパラメータの送信を防止するために役立ちます。
paramsで取得できる値はブラウザからの送信値であり、悪意のあるユーザであればいくらでも不正なパラメータを追加して送れます。
そのためparamsで取得できる値をそのままデータベースに保存するのは危険であり、その対策としてStrong Parameterが導入されました。
Strong Parameterについては以下の記事を参照してください。
≫ 【Rails】Strong Parameterの使い方と仕組みを徹底解説【初心者向け】
まとめ
本記事では、Ruby on Railsにおけるparamsの基本的な使い方について解説しました。paramsはWebアプリケーション開発において基本的かつ非常に重要な概念であり、Ruby on Railsを学ぶ上で早いうちに理解しておく必要があります。
ぜひマスターしてください。