12
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

paramsとform_withについて【初学者の備忘録】

Last updated at Posted at 2019-08-22

#paramsとは
・HTTPリクエストによって作成されたパラメータを参照するためのメソッドです。(保存はしません)
・ハッシュのような形で値を参照するため、キーと値がセットとなっています。ハッシュではありません。

 なのですが、内部の動きはその通りでも、初学者にとっては、コードをパッと見るだけではよくわからないのです。。。
 この記事ではあるあるなコードで解説します。

#viewでの動き
まず、下記のようにform_withで入力データを飛ばすことを考えます。

posts_controller.rb
  def new
    @posts = Post.new
  end
new.html.erb(posts_controller)
<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>

##理解したいポイント

  1. <% form_with(model: @posts... の、model: @postsの部分
  2. <%= 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アクションで実施します。
  下記のような。

posts_controller.rb
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

12
5
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?