Rails 3使用链接提交表单

16

我该如何使用正确的Rails 3格式通过链接提交表单?谢谢。

<%= form_for @post do |f| %>
<%= f.label :title %><br>
<%= f.text_field :title %>
<p><%= f.submit %></p>
<% end %>

我的代码示例。


添加一些代码是非常好的开始。 - shingara
5个回答

29

对于通过谷歌搜索到这里的人,我有一个对Zequez答案的改进。不要使用他给出的方法,而是将此方法添加到应用程序助手中:

def link_to_submit(*args, &block)
  link_to_function (block_given? ? capture(&block) : args[0]), "$(this).closest('form').submit()", args.extract_options!
end

如Zequez所述,对于简单的链接,您可以在视图中执行以下操作:

<%= link_to_submit 'Submit Form' %>

...对于更复杂的按钮,你可以传递HTML选项和一个块用于链接内部。例如,如果你使用Twitter Bootstrap,这让你可以添加CSS类、格式和图标。

<%= link_to_submit( class: 'btn btn-primary' ) do %>
  <strong>Submit</strong> the Form <i class="icon-arrow-right"></i>
<% end %>

只要链接是表单的子元素(也就是说,只要从form_for块中的某个位置调用link_to_submit),JQuery代码就会起作用。


2
那确实是一个更可靠的助手。 - Zequez
是的,如果没有你的答案,我就不会想到这个。jQuery和link_to_function的存在都是你的功劳。 - Jazz
这个能在表单对象 f.submit_link 上完成吗? - stevenspiel

13

在这个上下文中,“正确”是一个棘手的词 ;)。有人可能会问,为什么你不只是拿一个button元素并让它看起来像一个链接呢?

无论如何——你不能用纯HTML实现这个(至少我不知道)。使用像jQuery这样的JavaScript框架,你可以简单地做这样的事情:

$('a').click(function(){
    $('form').submit();
    return false;
});

Rails 2.3.x有一个link_to_remote助手,它可以让你指定一个:submit参数(= DOM元素的ID,默认为父表单)。因此,你可以编写以下代码:

link_to_remote 'submit', :url => {…}, :submit => "my_form"

但是随着Rails 3推动使用UJS,这个助手函数已经被移除了。


文章链接已经损坏或被广告劫持。 - Ain Tohvri

13

您可以将以下内容添加到应用程序助手中:

def link_to_submit(text)
  link_to_function text, "$(this).closest('form').submit()"
end

然后在您的视图文件中,您只需要调用

link_to_submit 'Submit Form'

链接必须是表单的子元素。


很棒!甚至不知道这个存在。 - Dom
对于从谷歌来到这里的人,请往下看,我在这个答案中找到了一个改进。 - Jazz

7
使用jQuery,这个一行代码可以很好地处理简单的表单。
<%= link_to t("translate.submit"), "#", class: "make it beautiful", :onclick=>"$('form').submit()" %>

当然,你不一定非要使用jQuery,只需要找到表单的DOM元素即可。

<%= link_to t("translate.submit"), "#", class: "make it beautiful", :onclick=>"document.getElementById('your_form_id').submit()" %>

这样你就不需要使用任何ajax,只需使用普通的表单提交。

我使用了这种方法,它运行良好。虽然,你可能想在 :onclick 的结尾添加 'return false;' 来确保链接不会被跟踪。 - Jeffrey Harrington

5
在Rails 3中,link_to_remote助手已经被移除,但它被以下代码所取代: link_to 'submit me', url_for(@post), {:remote => true, :class => 'submit_me'} 在您的情况下,您可能希望使用表单来进行AJAX操作,例如:
<%= form_for @post, :remote => true do |f| %>
  <%= f.label :title %><br>
  <%= f.text_field :title %>
  <p><%= f.submit %></p>
<% end %>

有伴侣链接:
link_to 'submit me', '#', :class => 'submit_me'

然后,在页面主体中包含的 .js 文件中:
$('.submit_me').click(function() {
  $('form').submit();
  return false;
});

这里的想法是,除了将链接或表单转换为ajax请求之外,任何更复杂的操作都应使用jQuery回调函数来完成,如下所列:

https://github.com/rails/jquery-ujs/wiki/ajax

如果你想深入了解交互式的AJAX请求,请点击这里阅读一篇很棒的两部分文章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接