少於 1 分鐘閱讀

前言

會有這樣的主題,是因為在寫Rails專案時,通常都是link_to到底,很少用到button_to,因為link_to加上btn的class就長得跟button一模一樣了。

但最近常常遇到一些光怪陸離的事情,例如:

  1. 在link_to下了method: :post卻一直用 get送
  2. 明明下了method: :delete,偏偏跑去:show
  3. 明明在development可以用,到production又不行。

像這些鳥事,絕對不能只有我遇到。

原因確認

爬文的結果發現,遇到link_to指定method的問題要考慮的是:

  1. 先檢查在application.js裡面jquery_ujs是否有正常載入
  2. 因為這些data-method都是需要靠jquery_ujs去產生,要考慮javascript是否在某個地方有先掛掉

另外,還發現了一件事情,使用button_to就沒問題,只好來驗證一下發生什麼事情

驗證

<%= link_to("home", root_path) %>
<!--
 <a href="/">home</a>
-->

加入 method: :post後

<%= link_to("home", root_path, method: :post) %>
<!--
 <a rel="nofollow" data-method="post" href="/">home</a>
-->

link_to:會用data-method也就是javascript( jquery_ujs )方式去post

改用 button_to 後

<%= button_to("home", root_path, method: :post) %>
<!--
<form class="button_to" method="post" action="/">
  <input type="hidden" name="_method" value="delete">
  <input type="submit" value="home">
  <input type="hidden" name="authenticity_token" value="LXXB5ZeAj7h5Sh3wGhScRplUP3aDc9xI3Czuoyntmx9srorYsoZ6QQdn6jQWIiyS6ZPR+VohNHb9O8z7xsks1g==">
</form>
-->

button_to:他會產生form搭配hidden欄位用原生方式去post

結論

原生寫法時,我們就儘量不使用javascript寫法, 所以以後遇到單行的post,

就直接把link_to改成button_to吧!

參考

  1. http://stackoverflow.com/questions/4799541/rails-3-method-post-doesnt-work-seems-to-be-get-when-it-should-po
  2. http://stackoverflow.com/questions/18154916/rails-4-link-to-destroy-not-working-in-getting-started-tutorial

更新時間:

留言