[Rails] 關於 link_to 及 button_to 指定 method 的探討
前言
會有這樣的主題,是因為在寫Rails專案時,通常都是link_to到底,很少用到button_to,因為link_to加上btn的class就長得跟button一模一樣了。
但最近常常遇到一些光怪陸離的事情,例如:
- 在link_to下了method: :post卻一直用 get送
- 明明下了method: :delete,偏偏跑去:show
- 明明在development可以用,到production又不行。
像這些鳥事,絕對不能只有我遇到。
原因確認
爬文的結果發現,遇到link_to指定method的問題要考慮的是:
- 先檢查在application.js裡面jquery_ujs是否有正常載入
- 因為這些data-method都是需要靠jquery_ujs去產生,要考慮javascript是否在某個地方有先掛掉
另外,還發現了一件事情,使用button_to就沒問題,只好來驗證一下發生什麼事情
驗證
例如:單純的link_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吧!
留言