プログラミング初心者の勉強メモ。

あくまでメモなので、自分が忘れそうなことだけちょこちょこ書いてます。

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の引数を渡している