我的ajax请求有效,但我不了解服务器日志。当我查看服务器日志时,它会针对ajax请求说明以下内容:
Processing by UsersController#change_food as */*
我不知道为什么会说*/*
。我希望它如此说JS
:
Processing by UsersController#change_food as JS
这是整个事物的流程。对于这个ajax请求:我只是在选择框更改时为事件监听器绑定了绑定,然后在选择更改时提交ajax请求。这是表单字段:
# _form.html.erb
<div class="field">
<%= f.label :food_type_id %>
<%= f.collection_select :food_type_id, FoodType.all, :id, :name, {}, {data: {action: 'food_sel', food_change_js_url: "#{user_food_change_js_path}"}} %>
</div>
这是实际的ajax请求:
# application.js
$(document).on('turbolinks:load', function() {
$('[data-action="food_sel"]').on('change', function(){
var url = $(this).data('food-change-js-url');
$.ajax({
url: url,
type: "GET",
datatype: "application/js",
data: {food_type_id: $(this).val()}
})
});
});
以下是相关路线:
# routes.rb
get 'user_food_change_js', to: 'users#change_food'
将ajax请求路由到此控制器:
# users_controller.rb
def change_food
respond_to do |format|
format.js
end
end
呈现此视图:
# change_food.js.erb
alert("hello world");
我原本希望我可以将remote: true
放在选择框上,然后每当选择更改时,它都会向服务器发送ajax请求。不幸的是remote: true
仅适用于几件事:例如您的form_for
,form_tag
,您的链接和按钮。我想不出更清楚为什么在触发事件时向服务器发送ajax请求(通过js)。
问题:我觉得我正在做一些非常规的事情,因为服务器日志并没有说明它是由JS
进行处理而是*/*
。有没有更传统的方法来做到这一点?会说它是由JS
处理的吗?
更新
基于已接受的答案:我所要做的就是将dataType
键设置为camelCase并正确设置。其他一切都保持不变:它让它运转起来:
# application.js
$(document).on('turbolinks:load', function() {
$('[data-action="food_sel"]').on('change', function(){
var url = $(this).data('food-change-js-url');
$.ajax({
url: url,
type: "GET",
dataType: "script",
data: {food_type_id: $(this).val()}
})
});
});
答案 0 :(得分:3)
第一个问题是Javascript对象中的键区分大小写,因此datatype
与dataType
不同。
其次,dataType
密钥与contentType
不同,但如果您不在contentType
,jQuery将从dataType
推断出来。在您的情况下,您需要script
,而不是application/js
(正如@Ruslan也指出的那样)。
将这些放在一起,你想要:
$.ajax({
url: url,
type: "GET",
dataType: "script",
data: {food_type_id: $(this).val()}
})
如果仍然无效,我会查找全球设置contentType
的地方,例如致电$.ajaxSetup
。
答案 1 :(得分:1)
尝试:
dataType: 'script'
可能有效
答案 2 :(得分:1)
尝试将.js
附加到user_food_change_js_path
。
另外 - change_food_js.erb
是错字吗?我本来期望change_food.js.erb
(点而不是下划线)
答案 3 :(得分:0)
试
contentType: "text/javascript"
答案 4 :(得分:0)
添加标题怎么样?
Stopwatch extime;
public Form1(){
InitializeComponent();
extime = new Stopwatch();
extime.Start();
}
private void Foo(){
extime.Stop();
}