【初心者向け】paramsとは？

# はじめに
日々の学習お疲れ様です。rails初学者のものです。paramsについて初心者でもわかりやすいような言葉を使って記事にしてみたのでぜひ参考にしてみてください。それではいきましょう！

# paramsとは？
Railsにおけるparamsは、クライアントからサーバーに送信されるデータを格納するための特別なハッシュです。Webアプリケーションでは、ユーザーがフォームに入力した情報やURLのクエリパラメータ、APIリクエストなど、さまざまな方法でデータが送信されます。
簡単にいうと、paramsはユーザーが送った名前やメールアドレスなどのデータをparamsという箱にいれてサーバーへ渡すことで保存したり更新したりすることができるものです。

paramsを使うことで主に以下のようなデータにアクセスできます：
- URLの一部として渡される情報（例：検索条件やフィルター）。
- URLパスの一部として指定される識別情報（例：ユーザーIDや記事のID）。
- ユーザーがフォームに入力した情報（例：ユーザー名やメールアドレス）。
- ファイルアップロード（例：画像やドキュメント）。

# paramsの種類
Railsで使うparamsには、いくつかの種類があります。よく使用されるparamsをピックアップしてお伝えします。

### クエリパラメータ
URLに含まれる情報で、?の後に続く部分です。たとえば、/search?query=ruby&category=programmingというURLでは、queryやcategoryがクエリパラメータです。これは、検索条件などの情報を指定するために使います。

### ルートパラメータ
URLのパスの一部として指定される情報です。たとえば、/users/1というURLでは、1がユーザーのIDを表します。これを使うことで、特定のユーザーの情報を取得できます。

### ボディパラメータ
主にフォームから送信されるデータです。ユーザーが入力した名前やメールアドレスなどが含まれます。たとえば、名前を入力したフォームがあると、そのデータはボディパラメータとして送られます。

### ネストされたパラメータ
データが階層的に構造化されているものです。たとえば、ユーザーの情報とそのプロフィール情報を一緒に送信する場合に使います。params[:user][:name]のように、ネストされた形でデータにアクセスします。

# paramsの使い方
userを例として、ユーザーの名前やメールアドレス、年齢をフォームから送信し、それをコントローラーでparamsを使って取得・利用するケースを見てみましょう。
### 1. ユーザー情報を送信するフォーム（app/views/users/new.html.erb）
Railsのビュー（HTML）ファイルで、ユーザーが名前、メールアドレス、年齢を入力して送信するフォームを作ります。このフォームで送信されたデータがサーバーに届くと、paramsの中にその情報が格納されます。
```
<%= form_with model: @user, url: users_path, method: :post do |f| %>
  <div>
    <%= f.label :name, "名前" %>
    <%= f.text_field :name %>
  </div>
  <div>
    <%= f.label :email, "メールアドレス" %>
    <%= f.email_field :email %>
  </div>
  <div>
    <%= f.label :age, "年齢" %>
    <%= f.number_field :age %>
  </div>
  <div>
    <%= f.submit "ユーザーを作成" %>
  </div>
<% end %>
```
このフォームでは、ユーザーの名前（name）、メールアドレス（email）、年齢（age）を入力するフィールドが用意されています。送信ボタンを押すと、フォームのデータがサーバーへ送信されます。

### 2.コントローラーでのデータ取得例（app/controllers/users_controller.rb）
次に、送信されたデータをコントローラーで取得するコードを見てみましょう。コントローラーでは、paramsを使ってフォームから送られたデータを受け取り、ユーザー情報を新しく作成します。
```
class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    # paramsを使ってフォームから送られたデータを取得
    user_name = params[:user][:name]      # "name"フィールドの値を取得
    user_email = params[:user][:email]    # "email"フィールドの値を取得
    user_age = params[:user][:age]        # "age"フィールドの値を取得

    # 取得したデータを使って新しいユーザーを作成
    @user = User.new(name: user_name, email: user_email, age: user_age)

    if @user.save
      redirect_to @user, notice: "ユーザーが作成されました！"
    else
      render :new
    end
  end
end
```
- user_name = params[:user][:name]
paramsの中から、キーuserの中にあるnameフィールドのデータを取り出し、user_name変数に保存しています。

- user_email = params[:user][:email]
同様に、emailフィールドのデータを取り出し、user_email変数に保存しています。

- user_age = params[:user][:age]
ageフィールドのデータも同様に取り出して、user_age変数に保存しています。

- @user = User.new(...)
取得したデータを使って、新しいユーザーのインスタンスを作成しています。RailsのUserモデルに対応するデータベースにこの情報が保存されます。

 ### 3. ルーティング設定（config/routes.rb）
この例では、createアクションを使用してデータを保存するため、ルーティングを設定します。
```
Rails.application.routes.draw do
  resources :users, only: [:new, :create, :show]
end
```
resources :usersを使うことで、new（新規ユーザー作成ページ）、create（データの保存処理）、show（保存したユーザーの詳細表示）の3つのアクションが使用できるようになります。

### 4. 保存されたデータを表示するビュー（app/views/users/show.html.erb）
新しいユーザーが作成された後、そのユーザー情報を表示するページを作成します。
```
<h1>ユーザー情報</h1>
<p>名前: <%= @user.name %></p>
<p>メールアドレス: <%= @user.email %></p>
<p>年齢: <%= @user.age %></p>
```
これで、フォームから送信されたユーザー情報がparamsを使って取得され、データベースに保存された後、showページに表示されます。

# 応用編
より実践的なparamsの使い方を紹介します。

### 1. Strong Parameters（ストロングパラメータ）
Railsでは、セキュリティのため、受け取るパラメータをあらかじめ指定しておく必要があります。これを「ストロングパラメータ」と呼びます。例えば、ユーザー情報を受け取る場合は以下のように設定します：
```
def user_params
  params.require(:user).permit(:name, :email, :age)
end
```
requireは必須のデータを指定し、permitは許可するデータを指定します。これによって、許可されていないデータが送られても無視されるため、安全にデータを扱えます。

#### デバッグでparamsの中身を確認する
開発中に、paramsの中身が期待通りかどうかを確認したいことがあります。そのときは次のコードを使って、paramsの内容を確認できます：
 ```
Rails.logger.debug(params.inspect)
```
これをコントローラのコード内に書くと、paramsの内容がログに出力されるので、何が送られているかを把握しやすくなります。

### 2. 隠しフィールド
隠しフィールド（hidden_field）は、ユーザーには見えないデータをフォームに含めて送信する方法です。例えば、ユーザーIDや特定のトークン、選択されたオプションの情報などをユーザーが操作しなくても一緒にサーバーへ送りたいときに役立ちます。

```
<%= form_with model: @post, url: posts_path, method: :post do |f| %>
  <%= f.hidden_field :user_id, value: current_user.id %>  <!-- 隠しフィールド -->

  <div>
    <%= f.label :title, "タイトル" %>
    <%= f.text_field :title %>
  </div>

  <div>
    <%= f.label :content, "内容" %>
    <%= f.text_area :content %>
  </div>

  <%= f.submit "投稿を作成" %>
<% end %>
```
f.hidden_field :user_id, value: current_user.id
この行で隠しフィールドを作ることで、ユーザーはフォームに入力しなくても見えないところでuser_idを送ることができるようになるのでエラー回避につながることがあります。


# まとめ
いかがだったでしょうか。
paramsは、Railsでユーザーが送信したデータを受け取り、活用するための大事なツールです。paramsを使うことで、フォームからのデータやURLの情報を簡単に取得し、アプリケーションで必要な処理に使えます。
これらのポイントを理解することで、Railsでのデータ処理がぐっとスムーズになり、セキュリティも高めることができます。Railsを使う際に、ぜひparamsを活用して、柔軟で安全なアプリケーションを作ってみてください。