Rails 4、Turbolinks、およびリモートフォームを使用すると、奇妙な問題が発生します。次のようなフォームがあります。
<%= form_for [object], remote: true do |f| %>
<td><%= f.text_field :name, class: 'form-control' %></td>
<td><%= f.email_field :email, class: 'form-control' %></td>
<td><%= f.submit button_name, class: 'btn btn-sm btn-primary' %></td>
<% end %>
このフォームは、新しいオブジェクトを追加 (作成) します。ただし、常に機能するとは限りません。
- URLまたは更新を使用してページを直接ロードすると; できます
- アプリからこのページに移動すると; それは失敗します
このリンクのターボリンクを無効にすると、ページは完全に機能しました。
2 つの質問があります。
- なぜこれが機能しないのですか?これは、JQuery/Turbolinks の問題により、リモート ハンドラーがボタンにアタッチされていないためですか?
- この問題を回避するにはどうすればよいですか?
前もって感謝します。
解決
@rich-peck のおかげで、解決策は、ボタンをクリックしたときにフォームを手動で送信する JavaScript を追加することでした。
<%= javascript_tag do %>
var id = "#<%= dom_id(f.object) %>";
var inputs = $(id).parent().find('input');
console.log(inputs);
$(id).parent().find('button').on('click', function(e) {
e.preventDefault();
$(id).append(inputs.clone());
$(id).submit();
});
<% end %>
このコードはフォーム テーブルの行に JavaScript を追加し、入力を取得して ID に追加し、フォームを送信します。preventDefault(); ページが更新され、フォームが実際に機能するときに、クエリが 2 回送信されるのを防ぎます。