2
4

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 3 years have passed since last update.

[Rails] ヘルパーメソッドform_withについて[基礎]

Posted at

学習中に理解が浅かったところなのでアウトプットしながら整理したいと思います。
基礎から丁寧に書いていきます。もし指摘あればお願いいたします。

##ヘルパーメソッドとは
そもそもrailsでは、viewでHTMLタグを出現させたりテキストを加工するためのメソッドが予め用意されています。これらをヘルパーメソッドといいます。
form_withはヘルパーメソッドの一種です。

*ヘルパーメソッドの一例
ヘルパーメソッド 使用用途
form_tag 投稿ページなどにおけるフォームの実装
link_to      リンクの実装
simple_format 投稿した文章を自動で見やすく整形する
submit_tag    submit機能をつけたいときに使う。
text_field_tag
などなど、、
自作することも可能らしいです。
【参考記事】
https://qiita.com/Yukaaaah/items/19e524fd0c0e4a3451f1

##form_withについて
Rails 5.1というバージョンから推奨されているフォーム実装のためのヘルパーメソッドです。
form_tag/form_forは非推奨となっているらしいです。(この2つのメソッドについては説明を省略します。)

.erb
<!-- form_tagを使用した例 -->
<%= form_tag('/posts', method: :post) do %>
  <input type="text" name="content">
  <input type="submit" value="投稿する">
<% end %>
.erb
<!--form_withを使用した例-->
<%= form_with model: @post, local: true do |form| %>
  <%= form.text_field :content %>
  <%= form.submit '投稿する' %>
<% end %>

form_withの特徴としては、
①自動でパスを選択してくれて、HTTPメソッドを指定する必要が無いこと
②コントローラーから渡された、ActiveRecordを継承するモデルのインスタンスが利用できること(上記では@postがそれに該当)

またこの場合は、
①新規投稿の場合
②既存の投稿を呼び出した場合
で処理が変わってきます。

##①新規投稿の場合

posts_controller.rb
def new
  @post = Post.new
end

投稿ボタンをクリックしたらcreateアクションに送られます。

new.html.erb
<%= form_with model: @post, class: :form, local: true do |form| %>
  <%= form.text_field :title, placeholder: :タイトル, class: :form__title %>
  <%= form.text_area :content, placeholder: :ブログ本文, class: :form__text %>
  <%= form.submit '投稿する', class: :form__btn %>
<% end %>

##②既存の投稿を呼び出した場合

posts_controller.rb
def edit
  @post = Post.find(params[:id])
end
edit.html.erb
<%= form_with model: @post, class: :form, local: true do |form| %>
  <%= form.text_field :title, placeholder: :タイトル, class: :form__title %>
  <%= form.text_area :content, placeholder: :ブログ本文, class: :form__text %>
  <%= form.submit '投稿する', class: :form__btn %>
<% end %>

投稿ボタンをクリックしたらupdateアクションに送られます。

##まとめ

比較してみるとnew.html.erbとedit.html.erbのフォーム部分は同じです!!!
そのためフォーム部分を部分テンプレート化できて記述量を減らせます。
モデルの@postの中身があるかどうかで自動で判断して送ってくれるのです。

このほかにも
例えばform_with model: [@￰post, @￰comment]のように複数モデルを渡すことができます。
それは別記事で書ければと思います、、

2
4
0

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
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?