Rails AJAX请求不处理为JS但* / *

时间:2017-02-28 21:54:50

标签: jquery ruby-on-rails ruby ajax

我的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_forform_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()}
    })

  });

});

5 个答案:

答案 0 :(得分:3)

第一个问题是Javascript对象中的键区分大小写,因此datatypedataType不同。

其次,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(); }