我花了太多时间在这上面,试图弄清楚它为什么不起作用。我已经尝试了两种方法都有缺陷。这让我疯了。这是我的代码。
方法1
表格
<%= form_for @order, remote: true do |f| %>
...
<% end %><br>
Js
$('#new_order').submit(function() {
$('input[type=submit]').attr('disabled', true);
//Some validations
if (validation successful) {
$('#new_order')[0].submit();
return false;
} else {
return true;
}
});
控制器
def create
#if @order.save, the usual
respond_to do |format|
format.js
end
end
现在,如果有一个format.html,那么它将遵循html重定向,如果没有,则会抛出406错误。它没有javascript正常工作但它仍然在标题中说html。
方法2
的表格
<%= form_for @order, remote: true do |f| %>
...
<% end %><br>
Js
$('#new_order').submit(function() {
$('input[type=submit]').attr('disabled', true);
//Some validations
var form = $(this);
if (validation successful) {
$.ajax({
type: "POST",
url: form.attr('action'),
dataType: "json",
data: form.serialize(),
complete: function(js_data){
alert(js_data);
}
});
return false;
} else {
return true;
}
});
控制器
def create
#if @order.save, the usual
respond_to do |format|
format.json { render json: @order }
end
end
现在这个工作得更好,没有重定向或406错误但它忽略了完整或成功块中的所有内容。因此,即使成功创建订单,页面也保持不变。
Nb:此页面是子域名页面。例如blog1.mysite.com,但它没有js。
我理想的方法是第一种方法。反正是否强制提交响应format.js?
感谢。
答案 0 :(得分:2)
您可以手动强制请求格式响应js 在控制器中添加一个前置过滤器。
before_filter :default_format_js, only: :create
def default_format_js
reponse.headers['content--type'] = 'text/javascript'
request.format = 'js'
end