Отправить форму с помощью link_to in rails

Я пытаюсь отправить форму с помощью link_to следующим образом:

 <%= form_for(@post,  :url=> '/post/action', :method=> 'post', :html => {:id=>'form_id'} ) do |f| %>
  ....

 <%= link_to 'submit', "/post/action", :onclick=>"document.getElementById('form_id').submit()" %>

  ....

но он не отправляет форму, она просто перенаправляет мою форму на указанный URL. Кто-нибудь знает, как это сделать?

Ответ 1

Вы можете использовать:

<%= link_to 'submit', "#", :onclick => "$('#form_id').submit()" %>

если вы используете JQuery и более позднюю версию рельсов.

Выше будет работать, но если у вас действительно длинная страница, он будет перемещаться по верхней части страницы из-за "#", поэтому, если вы хотите избежать этого, вы можете сделать:

<%= link_to 'submit', "", :onclick => "$('#form_id').submit()" %>

Ответ 2

Я думаю, что все происходит. Браузер начинает подавать форму, но также следует по ссылке href. Вы можете исправить это, связавшись с # вместо /post/action...

... однако я не рекомендую это делать. Есть несколько лучших подходов:

Сначала вы можете использовать кнопку вместо ссылки. Вам придется стилизовать его, чтобы он выглядел как ссылка, но это не должно быть проблемой. Это будет лучше, потому что это не нарушит Принцип наименьшего сюрприза (люди, которые читают формы ожидающего кода, которые будут отправляться с кнопками), и вам не понадобится JavaScript.

Если вы настаиваете на использовании ссылки, вы должны хотя бы переместить код JavaScript из представления в файл JavaScript. Затем добавьте это поведение ненавязчиво (хотя у вас не будет хорошей резервной связи со ссылкой). Предполагая, что вы используете jQuery, это должно быть так же просто, как:

$(document).on('click', '[data-submit-form]', function(e) {
  e.preventDefault();
  $(this).closest('form').submit()
}