はじめに
どうも、Aliceです。最近Ruby on railsを勉強し始めたのですが、paramsというメソッドの理解にとても苦戦しました。
今回は、paramsについて、つらつらと書いていきます。
僕のように、railsを学び始めた方の理解に少しでも貢献出来たら嬉しいです。
(Githubのissueにメモしてたのをそのまま使ってるので文体とかおかしいかもだけど許して....)
paramsとは
一言で言うと : 「URLやフォームから送られてきたデータが入っている箱」のこと。
中身はRubyのハッシュである。
例)
/posts/2/edit にアクセスすると、Railsは:idの部分を読み取って
params[:id] # => 2 が自動で入る。
なぜハッシュになるか?
Railsのroutes.rbでこのように書くとする。
get "posts/:id/edit, to: "posts#edit
:idの部分が 「プレースホルダー」になり、URLの数字を取ってきてparamsに入れる。
つまり:
| アクセスされたURL | paramsの中身 |
|---|---|
| /posts/1/edit | { id: "1" } |
| /posts/100/edit | { id: "100" } |
コントローラーではこうなる
def edit
@post = Post.find(params[:id])
end
① params[:id] → "2"(文字列)
② Post.find(2) → id = 2のレコードをDBから取り出す
③ それをビューで表示できるように@postに入れる。
→ ここでデータをDBから取り出し、edit.html.erbに渡す。
viewのlink_toに「id」が自動で入る理由
editページへのリンクを以下のように書くとする。
<%= link_to "編集", edit_post_path(@post) %>
Railsが自動で
/posts/2/edit
のように変換する。
裏側ではこのように処理されているらしい。
edit_post_path(@post) # => "/posts/2/edit"
この2がparams[:id]に入る。
より具体的な流れ
① ブラウザで/posts/3/editにアクセス
② Railsがroutesを見て
・ コントローラー → posts
・ アクション → edit
・ params[:id] = "3"をセットする
③ コントローラーで
@post = Post.find(params[:id])
④ edit.html.erbに渡す
⑤ viewで <%= @post.title %>のように表示できる。
逆に、フォーム送信の時は?
ユーザからフォームが送られてくると、 paramsの中はもっと増える
[ブラウザ]
title: "今日のごはん"
body: "カレー"
▼ 送信
[サーバ/Rails]
params = {
"post" => {
"title" => "今日のごはん",
"body" => "カレー"
}
}
よって cotrollerで
params[:post][:title]
params[:post][:body]
を取り出すことができる。
まとめ
paramsはどこから来たのか
| どこから来たのか | どんな値か | 控え場所 |
|---|---|---|
URLの/:id
|
id | params[:id] |
| フォーム送信 | 入力データ | params[:post][:title] など |
| クエリパラメータ | ?search=curry | params[:search] |
多分、もっとしっかり理解しようとすると、HTTPについての知識やフォーム送信・POSTの仕組みの理解が必要になると思います。しかし、ここで理解しておくと、この後がぐっと楽になるので一緒に頑張りましょう!!!
それではまた~👋