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で渡されたオブジェクトを判定し、
そのオブジェクトが新規で作成されたものなのか、既存のものなのかを判定。新規ならばcreate、既存ならばupdateアクションへのパスを生成。
そのモデルと同名のコントローラーのアクションへと遷移するように自動でパスを生成。
・モデルに紐づかないフォームを生成する場合
#例 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
ネストした場合の書き方など詳細に載っている
その他参考サイト