如果您不反对使用 jQuery 和一些 ajax'n,我有一个 blog post 涵盖了这一点。
如果您想获得高级概述,这里有一些基本信息。
将此添加到您的布局中:
<%= javascript_tag "var AUTH_TOKEN = #{form_authenticity_token.inspect};" if protect_against_forgery? %>
此代码将身份验证令牌添加到响应中。这样JS就可以把它捡起来提交给服务器了。
接下来我们拦截 application.js 中的任何 ajax 调用:
function isPost(requestType) {
return requestType.toLowerCase() == 'post';
}
$(document).ajaxSend(function(event, xhr, settings) {
if (isPost(settings.type)) {
settings.data = (settings.data ? settings.data + "&" : "") + "authenticity_token=" + encodeURIComponent( AUTH_TOKEN );
}
xhr.setRequestHeader("Accept", "text/javascript, application/javascript");
});
将此添加到您的应用程序控制器:
before_filter :correct_safari_and_ie_accept_headers
after_filter :set_xhr_flash
protected
def set_xhr_flash
flash.discard if request.xhr?
end
def correct_safari_and_ie_accept_headers
ajax_request_types = ['text/javascript', 'application/json', 'text/xml']
request.accepts.sort!{ |x, y| ajax_request_types.include?(y.to_s) ? 1 : -1 } if request.xhr?
end
在你看来:
<%= link_to "Delete", delete_product_path(product), :class => 'delete' %>
回到 application.js:
$('a.delete').live('click', function(event) {
if(event.button != 0) { return true; }
$.post(link.attr('href').substring(0, link.attr('href').indexOf('/delete')), { _method: "delete" });
return false;
});
此示例执行删除操作,但处理帖子或放置的过程实际上是相同的。博文有一个完整的示例应用程序来演示这一点。