【Rails】初学者がparamsについてまとめてみた!
はじめまして!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_params
やboard_params
など ) を使う」といったところでしょうか。
ちょっとややこしい😇
params が取得する情報(パラメータ)について
params
とは、フォームなどによって送られてきた情報(パラメータ)を取得する時に使われる、ということでしたが、
送られてくる情報には、
- 「リンクや検索フォームなどGETで送信され、URLにクエリとして入るデータ」
- 「投稿フォームなどPOSTで送信されたデータ」
の2つがあります。
それらの情報を
params[:キーになる カラム名 や パラメータ名]
で取得することができます。
params はいつ使う?
params
とは、フォームなどによって送られてきた情報(パラメータ)を取得する時に使われる、ということでしたが、具体的には、
- 画面遷移先で情報を取得する時
- 入力フォームで送れられてきた情報を取得し、保存する時
に使います。
さらに詳しく説明すると、以下の2点でよく使われます。
- リンクによるパラメータの受け渡し(link_to)
- フォームによるパラメータの受け渡し(form_with)
例1)
【link_to】リンクによるパラメータの受け渡し
例えば、掲示板一覧から掲示板編集画面へ遷移する際、その掲示板の情報をデータベースから取得する必要があります。その際、params[:id]
でURLから掲示板の情報を取得します。
ビュー
<%= link_to "編集", edit_board_path(board) %>
編集
をクリックした時のURL(1はidで、掲示板ごとに異なります)
http://localhost:3000/boards/1/edit
コントローラ(URLに記載されているid = 1を取得しています)
def edit
@board = current_user.boards.find(params[:id])
end
例2)
【form_with】フォームによるパラメータの受け渡し
例えば、新規で掲示板を作成する際、入力フォームから送られてきた情報をデータベースに保存する必要があります。その際、board_params
というメソッドで情報を取得し、create
メソッドで情報をデータベースに保存します。
ビュー
<%= 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 %>
コントローラ
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
と一緒にrequire
とpermit
という新たな単語が書かれています。
そのrequire
とpermit
について説明する前に、まずは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にもたくさん質問しました!
Discussion