【Rails】paramsメソッドの使い方を徹底解説【初心者向け】

paramsメソッドの使い方を徹底解説Ruby on Rails

本記事では、Ruby on Railsにおける「paramsメソッド」について解説します。
paramsメソッドはユーザーから送信された情報を扱うための仕組みです

この記事を読むとRailsのparamsの基礎的な使い方を学べます。

スポンサーリンク

paramsとは

Ruby on Rails においてparamsメソッドは HTTP リクエストに含まれるパラメータを扱うためのメソッドです。

具体的には、ユーザーがフォームを送信したとき、そのフォームで入力された値やURLのクエリ文字列で渡された値などが params メソッドでハッシュオブジェクトとして取得できます。

クエリ文字列とはURLの末尾につける?以降の&区切りで並べられてパラメータ指定文字列です。
例えば以下のようなURLの場合は

https://example.com/posts?page=1&q=Rails

以下のようなパラメータを表します。

  • page=1
  • q=Rails

これは以下の意味です。

  • pageの値が”1″
  • qの値が”Rails”

paramsで取得できる値としては以下のようになります。

{
  "page" => "1",
  "q" => "Rails"
}
パラメータと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を学ぶ上で早いうちに理解しておく必要があります。

ぜひマスターしてください。

タイトルとURLをコピーしました