Ruby on Rails  form_withについて

●form_withについて

ヘルパーメソッドの一つで、Rails4系まで使用されていたform_forとform_tagを結合する形のもの。

モデルに紐づくフォームを生成=form_for

モデルに紐づかないフォームを生成=form_tag

具体的には、次のような形でフォームの定義を行います。

 form_with(model: nil, scope: nil, url: nil, format: nil, **options)

●使用方法

・モデルに紐づくフォームを生成する場合

#例 <%= form_with model: @user do |f| %> 

<% end %> 

※ | f |の f はformの略

@userで渡されたオブジェクトを判定し、

  1. そのオブジェクトが新規で作成されたものなのか、既存のものなのかを判定。新規ならばcreate、既存ならばupdateアクションへのパスを生成。

  2. そのモデルと同名のコントローラーのアクションへと遷移するように自動でパスを生成。

・モデルに紐づかないフォームを生成する場合

 #例 app/views/user_sessions/new.html.erb 
<%= form_with url: login_path do |f| %> 
  <%= f.label :email %> 
  <%= f.email_field :email %>
  <%= f.label :password %>
  <%= f.password_field :password %>
  <%= f.submit "ログイン!!" %> 
<% end %> 

モデルではなく、urlを直接渡す。ログインフォームなどではユーザーとではなく、あくまでログイン・セッションというリソースに紐づくという考え方なので、この形を使用する。

※form_withではデフォルトではajax通信になってしまうため、避けるにはlocal: true の記載が必要。

#例
<%= form_with model: @user, local: true do |f| %>

●form_withでよく使われるメソッド

label ラベルテキスト

check_box チェックボックス

password_field パスワード入力フィールド

submit 送信ボタン

text_area 複数行入力テキストエリア

text_field テキスト入力フィールド

●ネストしている場合の書き方

#部分テンプレート_form.html.erbで使用する場合
<%= form_with model: comment, url:[board, comment], local: true do |f| %>
  • インスタンス変数@commentではなく、ローカル変数commentを使っているのはコントローラーとの依存度を薄くして他のviewファイルから呼び出す際に扱いやすくしている為。インスタンス変数を使った場合は、それを使っているテンプレートを呼び出すControllerで対応するインスタンス変数を作成させておく必要も出てくる。

  • urlをパスではなく、オブジェクトを指定している理由はRailsの記法でオブジェクトを渡すと、URLとして認識する短い記載ができる為。書き方が短く記載できる場合は、それを前提として開発することでコードの記述量を短くするのがRailsでは一般的となります。url: board_comment_path(comment)などの記載でも同様に、HTMLフォーム側のaction属性の値にURL情報を反映できると思うので確認してみてください。

●参考サイト

下記Railsガイドに詳しく詳細が載っているので参考に railsguides.jp

ネストした場合の書き方など詳細に載っている

pikawaka.com

その他参考サイト

techacademy.jp