Rails で モデル と関係ない単純なフォームを送信するための View の最低限のコード

結論

以下のコードで、単に入力された値を送信することができます。CSRF対策も含まれています*1

<%= form_with url: hogehoge_path, local: true do %>
  <input name='foobar'>
  <%= button_tag 'ボタンに表示される名前', type: 'submit' %>
<% end %>

上記の erb を書くと、以下のようにフォームが表示されます。


gyazo.com


テキストボックスに文字を入力してボタンをクリックすると、params として次の値が渡ります。ここでは、フォームの中身として「おはようございます」という言葉を入力したとします。

{"authenticity_token"=>"IbZ+3TYfHJB7EbPvbxknHJ4JjdunJX6rgSZsmqAjq6nSWaSRhwUGmjldTq3ZLw399NRQEgMhVo8we2SyCVVbbg==", "foobar"=>"おはようございます", "button"=>"", "controller"=>"home", "action"=>"create"}
  • "controller"=>"home" となっていますが、これは私が命名したものです*2
  • "button" の値が空っぽですが、この値は例えば value: 'fugafuga' のようにして valuebutton_tag の引数に追加すれば params で取得できます。
  • input における name は必須です
    • name がないと params に渡って来ないです
  • local: true は「最低限のコード」かどうか迷ったのですが、入れました*3

補足

  • 上記は View のコードなので、動作させるためには Controller および routes.rb を適切に記述する必要があります
    • 具体的には以下のとおりです
      • Controller にフォームの送信のデフォルトのアクションは create なので、create アクションを記述すること
      • routes.rb にフォームの送信先を定義すること*4
  • 小さい形で動かすことができれば、あとは引数を追加していったりフォームの項目を増やしていったりすることは難しくないかと思います

考察

もっと単純にできるかもしれません*5

*1:厳密には csrf_meta_tags を用いるケースも考慮する必要があります

*2:予約語ではありません

*3:詳しくは調べてみてください

*4:それにより、最初の erb の例にある、hogehoge_path が定義されます

*5:「単純」の定義にもよりますが

Powered by はてなブログ