form_withの動作に関して
twitterクローン作成中
こんな疑問が浮かびました。
app/views/toppages/index.html.erbで、
<% if logged_in? %>
<div class="row">
<aside class="col-sm-4">
<%= form_with(model: @micropost, local: true) do |f| %>
<div class="form-group">
<%= f.text_area :content, class: 'form-control', rows: 5 %>
</div>
<%= f.submit 'Post', class: 'btn btn-primary btn-block' %>
<% end %>
</aside>
<div class="col-sm-8">
<%= render 'microposts/microposts', microposts: @microposts %>
</div>
</div>
<% else %>
<div class="center jumbotron">
<div class="text-center">
<h1>Welcome to the Microposts</h1>
<%= link_to 'Sign up now!', signup_path, class: 'btn btn-lg btn-primary' %>
</div>
</div>
<% end %>
というコードの
<%= f.submit 'Post', class: 'btn btn-primary btn-block' %>
の部分。
解説によると、「このフォームより Micropost を投稿できるようにmicroposts#createとしてcreateアクションを実装する」と書いてあるが、なぜtoppages.index.html.erbのページからいきなりMicropostsContorllerのcreateアクションへ飛べるのでしょうか...?
自分の中では、link_toメソッドのように、コード内にリンク先が明示されているのであれば理解出来るのですが、f.submitで作ったボタンを押すだけでmicroposts#createに飛ぶのがなぜか分からなくなってしまいました。
メンターの方からの回答
メンターの方に聞いたところ、非常にわかりやすい回答をいただきました。
以下その回答です。(一部抜粋)
form_withの動作の話ですね。
フォームの投稿先のURLは、ボタンのタグではなく、formタグに記載されます。
form_withメソッドは、model引数*1が渡されると、その内容からURLとHTTPメソッドを自動で決めます。
ここではまだ保存されていないMicropostクラスのインスタンスなので、/micropostsへのPOSTメソッドのリクエスト送信になる、という感じです。
実際に作られたHTTPを、ブラウザの「検証」や「ページのソースを確認」で見てみると良いでしょう。
「これ以上の説明はない」というくらいわかりやすい解説をいただきました。
ありがとうございます。
*1:今回なら<%= form_with(model: @micropost, local: true) do |f| %>の"model: @micropost "という部分でmodelの引数を渡している