#paramsとは
・HTTPリクエストによって作成されたパラメータを参照するためのメソッドです。(保存はしません)
・ハッシュのような形で値を参照するため、キーと値がセットとなっています。ハッシュではありません。
なのですが、内部の動きはその通りでも、初学者にとっては、コードをパッと見るだけではよくわからないのです。。。
この記事ではあるあるなコードで解説します。
#viewでの動き
まず、下記のようにform_withで入力データを飛ばすことを考えます。
def new
@posts = Post.new
end
<div class="container">
<%= form_with(model: @posts, local: true) do |f| %>
<div class="form-group">
<%= f.label :title, "タイトル" %>
<%= f.text_field :title, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :summary, "要約" %>
<%= f.text_area :summary, size: "20x5", class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :description, "本文" %>
<%= f.text_area :description, size: "20x10", class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :url, "参考URL" %>
<%= f.text_area :url, size: "20x1", class: "form-control" %>
</div>
<%= f.submit "投稿する", class: "btn btn-primary" %>
<% end %>
</div>
##理解したいポイント
- <% form_with(model: @posts... の、model: @postsの部分
- <%= f.text_field :title...や、<%= f.text_area :summary...などの入力フォームの属性
##詳細
1.<% form_with(model: @posts... の、model: @postsの部分
→form_withでmodelオプションをつけると、
引数のインスタンス(@posts)が何も情報を持っていない場合、createアクションへ、
情報を持っている場合、updateアクションへ自動的に振り分けてくれます。
→今回はnewしているので、createアクションへ飛びます。
2.<%= f.text_field :titleの部分
→:titleは、あくまでparamsメソッドで参照する際のキーです。
controllerではparams[:title]という形で呼ぶことができます。
最終的に、DBのtitleカラムに保存するため、:titleとする必要があります。
:titleとしない場合、次のcreateアクションで
ストロングパラメーターの検証は通りますが、DBに保存することができません。
(permit(:hoge)は合わせる必要ありですが)
paramsメソッドを使って値を参照するだけなら、ここは:user_nameでも:timeでも良いです。
ここら辺が、こんがらがるポイントかと思っています。
DBへの保存処理は、次のcreateアクションで実施します。
下記のような。
def create
@post = current_user.posts.new(post_params)
if @post.save!
redirect_to @post, notice: "「#{@post.title}」を投稿しました。"
else
render :new
end
end
private
def post_params
params.require(:post).permit(:title, :summary, :description, :url)
end
##ポイント
post_paramsメソッド内の、
**params.require(:post).permit(:title, :summary, :description, :url)**の部分。
この:postとか、:titleは、あくまでparamsメソッドで参照する値のキーを指定し、値を検証しているだけです。
createメソッドの
@post = current_user.posts.new(post_params)の部分で初めて
paramsメソッドからキーと値が渡されます。
paramsメソッドのキーとDBカラムが一致しない場合は、ここでエラーが表示されてしまいます。
##★paramsがハッシュ的であることについて
Railsガイド
"このparamsハッシュは一見ハッシュのように振る舞いますが、キーとしてシンボルと文字列のどちらでも指定できる点がハッシュと異なります。"
参考:https://railsguides.jp/action_controller_overview.html