7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【初学者向け】railsのparamsについて分かりやすく解説してみた

Last updated at Posted at 2023-02-21

はじめに

どうも初学者のかずです。
最近業務でrailsを触らせてもらってるので記事書いてみました。
初学者でも分かりやすいように書いたつもりです。
どうぞご覧ください~(/・ω・)/

paramsとは

paramsは、RailsにおいてHTTPリクエストから受け取ったパラメータを扱うための変数だよ。
Railsにおいて、HTTPリクエストに含まれる各種情報はすべてこのparamsという変数で扱うことができるんだ。

以下に、具体的なコードを使って、paramsについて分けて説明するよ。

1. paramsの基本的な使い方

paramsには、HTTPリクエストに含まれるクエリパラメーターやフォームデータなどがハッシュ形式で格納されてるんだ。
例えば、フォームで以下のようにデータを送信した場合、

test
<form method="POST" action="/articles">
  <input type="text" name="article[title]" value="Hello, World!">
  <textarea name="article[text]">This is my first post.</textarea>
  <input type="submit" value="Create">
</form>

paramsには以下のようにデータが格納されるよ。

uniq.rb
{
  "controller" => "articles",
  "action" => "create",
  "article" => {
    "title" => "Hello, World!",
    "text" => "This is my first post."
  }
}

このように、paramsにはコントローラーの名前やアクション名、そしてフォームデータが含まれるハッシュが格納されるんだ。
アクション内では、paramsを利用することで、フォームから受け取ったデータを取り出すことができるよ。

test.rb
class ArticlesController < ApplicationController
  def create
    @article = Article.new(article_params)
    # ...
  end

  private

  def article_params
    params.require(:article).permit(:title, :text)
  end
end

article_paramsは、paramsからarticleというキーを持つハッシュを取り出し、その中からtitleとtextというキーを持つ値を取り出してるよ。
このように、paramsを安全に扱うために、必ずrequireとpermitを使用することが推奨されてるよ。

2. paramsの配列について

paramsには配列のデータを含めることもできるよ。
例えば、チェックボックスやセレクトボックスの値を配列で送信した場合、paramsには以下のように格納されるんだ。

test.rb
{
  "controller" => "products",
  "action" => "index",
  "category_ids" => ["1", "3", "5"]
}

このように、category_idsというキーに配列が格納されるね。

もっと詳しくpermitって何?

article_params メソッドは、Railsで一般的に使用されるStrong Parametersと呼ばれる機能の一部であり、
Rails 4から導入された機能らしいよ。
Strong Parametersは、パラメータハッシュをクリーンにするために使われるみたい。

ストロングパラメータは、パラメータのキーをフィルタリングするために使用されるよ。
フィルタリングされたキーとそれに関連する値が含まれた安全なパラメータハッシュを生成し、それ以外のキーは単に無視されるんだ。
この機能により、悪意のあるユーザーが意図しないパラメータを送信して、アプリケーションの動作を乱すことができなくなるね。

article_params メソッドでは、params に含まれるパラメータをフィルタリングして、必要なキーだけを取得することができるよ。
具体的には、:titleと:textという2つのパラメータが含まれている :article キーのみを取得してるね。

以下に、article_paramsメソッドがどのように動作するかを示すコードを示すよ。

test.rb
def article_params
  params.require(:article).permit(:title, :text)
end

上記のコードを実行すると、params ハッシュは :article キーを必須とするように指定されるんだ。
:article キーが存在しない場合、ActionController::ParameterMissing エラーが発生するよ。
params.require(:article) を実行すると、params から :article キーを取得するね。

その後、 .permit(:title, :text) を実行することにより、
params[:article] から :title と :text のキーのみをフィルタリングして許可するよ。
つまり、params の中にある :article キーに、:title と :text という2つのキーが存在しない場合は、エラーが発生するんだね。

例えば、params が以下のように渡された場合、article_params メソッドは { title: 'title', text: 'text' } を返すよ。

test.rb
params = {
  article: {
    title: 'title',
    text: 'text',
    other_key: 'value'
  }
}

article_params = params.require(:article).permit(:title, :text)
# => { title: 'title', text: 'text' }

permit以外のフィルタリング

Railsには、Strong Parametersを使ってフィルタリングする方法があるよ。
以下に、permit以外にもフィルタリングする方法を3つ紹介するね。

1. except

exceptを使うことで、指定したキーをパラメータから除外することができるよ。

test.rb
def user_params
  params.require(:user).except(:password_confirmation).permit(:name, :email, :password)
end

上記の例では、:password_confirmationというキーをパラメータから除外し、:name、:email、:passwordのキーを許可するよ。

2. slice

sliceを使うことで、指定したキーだけを残すことができるよ。

test.rb
def user_params
  params.require(:user).slice(:name, :email).permit(:name, :email, :password)
end

上記の例では、:nameと:emailのキーだけを残し、:passwordのキーを除外しているよ。

3. transform_keys

transform_keysを使うことで、キー名を変更することができるんだ。

test.rb
def user_params
  params.require(:user).transform_keys { |key| key.to_s.camelize(:lower) }.permit(:name, :email, :password)
end

上記の例では、キー名をキャメルケースからスネークケースに変換しているよ。
例えば、:userNameというキーがあった場合には、:user_nameというキーに変換されるんだ。
このように、transform_keysを使うことで、外部とのAPI通信時に必要な形式にパラメータを変換することができるね。

最後に

読んでくださりありがとうございました!
よかったらいいね!お願いします。
指摘もあればどんどんコメントお待ちしております(´・ω・`)

7
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?