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

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

## paramsとは

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

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

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

```html: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には以下のようにデータが格納されるよ。

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

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

```ruby: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には以下のように格納されるんだ。

```ruby: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メソッドがどのように動作するかを示すコードを示すよ。

```ruby: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' } を返すよ。

```ruby: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を使うことで、指定したキーをパラメータから除外することができるよ。

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

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

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

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

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

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

```ruby: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通信時に必要な形式にパラメータを変換することができるね。

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