結論
link_to
メソッド -> GET
メソッドがデフォルト。
form_tag
メソッド -> POST
メソッドがデフォルト
link_toメソッド
下記のようなroutes.rbメソッド違いの同じURLが存在する時、postメソッドのURLにリンクするためには{method:"post"}
が必要です。({method:"post"}
がないと、getメソッドのパースにリンクされてしまう。)
post "posts/:id/destroy" => "..."
get "posts/:id/destroy" => "..."
<%= link_to (”destroy",”/posts/#{@post.id}/destroy),{method:"post"}) %>
form_tagメソッド
form_tagメソッドですと、post "posts/:id/destroy" => "..."
にデータを渡すためには、引数にmethodを指定する必要はありません。
下記のコードで渡すことができます。
<%= form_tag('/posts/#{@post.id}/destroy') do %>
<div><%= submit_tag 'Save' %></div>
<% end %>
なぜ?
link_to
メソッドもform_tag
メソッドも同じくURLを扱うメソッドなのに、なんでlink_to
のみ{method:"post"}
が必要かが、学習する際に、疑問でした。
それで、railsのgit hubを参照すると、
link_to
メソッドの説明
==== Options
method: symbol of HTTP verb ...
...
# Note that if the user has JavaScript disabled, the request will fall back
# to using GET ....
methodのオプションでJavaScirptが無効になっている場合は、Getメソッドを使用することになる。と書いてます。
form_tag
メソッドの説明
The method for the form defaults to POST.
...
:method The method to use when submitting the form, usually either "get" or "post".
# If "patch", "put", "delete", or another verb is used, a hidden input with name _method
# is added to simulate the verb over post.
formのデフォルトメソッドはPOSTだと書いています。
そして、メソッドがサブミットするときはpostが:methodオプションのhiddenインプットとして追加されるとなってます。
終わりに
学習をしていく上で'なぜ?'と思うときは、まずその言語のソースコードを読んでみることが大事だと教わりました。
今回はメソッドのデフォルトがGETやPOSTになっているからこういう動きをします!という簡単な内容でしたが、
ブログの検索しても出なかった内容が、ソースコードを読むことですぐに解決できましたので、ソースコードを読む習慣が大事だと実感したいい経験でした。
読んでくださってありがとうございました。