🧐

【Rails】初学者がparamsについてまとめてみた!

2023/10/28に公開

はじめまして!hime(@hime_7r)と申します。
現在プログラミングスクールに通っているプログラミング初学者です。
入学して3ヶ月目に突入しました。

技術記事を書くのは初めてです!
間違っている箇所があれば、ぜひ教えていただければと思います。

この記事の対象者

  • プログラミング初学者でparamsの理解を深めたい方

この記事のテーマ

現在カリキュラムで掲示板アプリを作成しています。
そんな中、コントローラで下記のような記述がよく出てきます。

  • params[:id]
  • params[:q]
  • params[:page]
  • params[:board_id]
  • params[:email]
  • params[:user][:password]
  • user_params
  • board_params
  • comment_params

paramsってなんやねん!😭」となりながらも、とりあえず雰囲気で書いてました。
この機会にそのparamsへの解像度を上げていきたいと思います。

「このよく出てくるparamsって一体何??🤔どんな役割があるの??🤔」
そんな方の参考になれば幸いです。

【はじめに】 - この記事の最終目標

突然ですが、下記のコードが何を意味しているか全て説明できますか?

@board = current_user.boards.find(params[:id])
def board_params
  params.require(:board).permit(:title, :body)
end

@board = current_user.boards.build(board_params)

私はできませんでした😂
この記事でparamsについてまとめ、記事の最後にはこのコードを説明できるようになることが目標です。

params とは?

paramsは「parameters(パラメータ)= 情報」の略です。
paramsは、Ruby on Railsのコントローラ内で使用される変数で、ハッシュの形式をしています。
paramsはフォームなどによって送られてきた情報(パラメータ)を取得する時に使われ、
そのメソッドにこの名前が使われます。

つまり、3つの意味・場面で使われているということです。
「フォームなどによって送られてきたparams(情報)params( という箱) にハッシュ形式で一時的に格納され、その情報を取得するためにparams( という メソッド = user_paramsboard_paramsなど ) を使う」といったところでしょうか。
ちょっとややこしい😇

params が取得する情報(パラメータ)について

paramsとは、フォームなどによって送られてきた情報(パラメータ)を取得する時に使われる、ということでしたが、
送られてくる情報には、

  • 「リンクや検索フォームなどGETで送信され、URLにクエリとして入るデータ」
  • 「投稿フォームなどPOSTで送信されたデータ」

の2つがあります。

それらの情報を

params[:キーになる カラム名 や パラメータ名]

で取得することができます。

params はいつ使う?

paramsとは、フォームなどによって送られてきた情報(パラメータ)を取得する時に使われる、ということでしたが、具体的には、

  • 画面遷移先で情報を取得する時
  • 入力フォームで送れられてきた情報を取得し、保存する時

に使います。

さらに詳しく説明すると、以下の2点でよく使われます。

  • リンクによるパラメータの受け渡し(link_to)
  • フォームによるパラメータの受け渡し(form_with)

例1)

【link_to】リンクによるパラメータの受け渡し
例えば、掲示板一覧から掲示板編集画面へ遷移する際、その掲示板の情報をデータベースから取得する必要があります。その際、params[:id]でURLから掲示板の情報を取得します。

ビュー

app/views/boards/index.html.erb
<%= link_to "編集", edit_board_path(board) %>

編集をクリックした時のURL(1はidで、掲示板ごとに異なります)

http://localhost:3000/boards/1/edit

コントローラ(URLに記載されているid = 1を取得しています)

app/controllers/boards_controller.rb
def edit
  @board = current_user.boards.find(params[:id])
end

例2)

【form_with】フォームによるパラメータの受け渡し
例えば、新規で掲示板を作成する際、入力フォームから送られてきた情報をデータベースに保存する必要があります。その際、board_paramsというメソッドで情報を取得し、createメソッドで情報をデータベースに保存します。

ビュー

app/views/boards/new.html.erb
<%= form_with model: @board do |f| %>
  <div class="mb-3">
    <%= f.label :title %>
    <%= f.text_field :title, class: "form-control" %>
  </div>
  <div class="mb-3">
    <%= f.label :body %>
    <%= f.text_area :body, class: "form-control", rows: 10 %>
  </div>
    <%= f.submit, class: "btn btn-primary" %>
<% end %>

コントローラ

app/controllers/boards_controller.rb
def create
  @board = current_user.boards.build(board_params)
  
  if @board.save
    redirect_to boards_path
  else
    render :new, status: :unprocessable_entity
  end
end

# 省略

private

def board_params
  params.require(:board).permit(:title, :body)
end

おや?🤔board_paramsを定義しているところで
paramsと一緒にrequirepermitという新たな単語が書かれています。
そのrequirepermitについて説明する前に、まずはparamsを使う時の注意点について
説明していきます。

params を使う時の注意点

paramsには、実はフォームに入力された情報以外の情報も自動で入っています。
これはセキュリティ面で非常に問題です。
なぜなら、情報をデータベースに保存したり、処理に使う際に、不正なデータや余分なデータが
混ざると、セキュリティ上の問題や意図しない挙動が発生する可能性があるためです。
それを防ぐためにrequireメソッドとpermitメソッドを使って、入力された情報に
ストロングパラメーターを実行します。

require メソッド と permit メソッド

まず、require必要 という意味で、permit許可 という意味です。
paramsに対してrequireメソッドを使用することで、指定したキーが必須であることを示します。
また、paramsに対してpermitメソッドを使用することで、特定の属性のみを許可し、それ以外のデータは無視されます。

【さいごに】 - この記事の最終目標を達成する

それでは最後に、この記事の冒頭で見たコードを説明していきたいと思います!💪

下記のコードは、

@board = current_user.boards.find(params[:id])

現在ログインしているユーザーの掲示板の中から、
URLに渡されたIDと一致する掲示板をデータベースから取得し、
それを@boardという変数に代入する

ということを示しています。

そして下記のコードは、

def board_params
  params.require(:board).permit(:title, :body)
end

@board = current_user.boards.build(board_params)

フォームから送られてきた情報の:boardというキーを必須とし、
それに対応する:title:bodyという属性のみを許可した後、
それらの値をboard_paramsというメソッドの戻り値として返す

board_paramsメソッドで許可された情報を使って、
現在ログインしているユーザーの新しい掲示板を作成し、
それを@boardという変数に代入する

ということを示しています。

これで今回の目標は達成ですね!🎉

まとめ

  • paramsは、ハッシュ形式でデータを保持している
  • paramsは、リンクなどGETで送信され、URLにクエリとして入るデータを取得できる
  • paramsは、フォームなどPOSTで送信されたデータを取得できる
  • paramsが使われるシーンは、情報を取得する時(画面遷移時とフォームで送られてきた情報を保存する時)
  • paramsの情報をそのままデータベースに保存するとセキュリティ面で問題がある
  • よって、requireメソッドとpermitメソッドを使い、ストロングパラメータを実行する必要がある

今回はparamsについてまとめてみました。
初めての技術記事でまとめるのに時間がかかりましたが、
めちゃくちゃ勉強になりました。
これからもコンスタントにアウトプットしていこうと思います。
ここまで読んでいただきありがとうございました!🙇‍♀️

参考

  • 以下の記事に加え、ChatGPTにもたくさん質問しました!

https://railsguides.jp/action_controller_overview.html#パラメータ
https://railsdoc.com/page/params
https://pikawaka.com/rails/params
https://www.sejuku.net/blog/29763
https://zenn.dev/kousei_089/articles/what_is_params
https://web-camp.io/magazine/archives/18258

Discussion