2

我在 Rails 应用程序上使用 angularjs。我想制作一个对服务器端数据进行分页的搜索表单。

这是我的表格:

<input type="text" class="search-query" placeholder="Search Products" ng-model="search_terms" />

我的 rails 控制器接受 json 或 html 请求:

def index
  # ....
  respond_to do |format|
    format.json {
      # ...
    }
    format.html {
      # ...
    }
  end
end

这是我的角度控制器。由于某种原因,$http 服务只能取回 rails 默认的 html 响应,而不是 json 响应。

$scope.$watch('search_terms',function(newValue,oldValue){
  var query = newValue;

  $http.get('/products',{params:{search_terms:query}, responseType:'json'}).success(function(data) {
  // do something
  });

});

如果我使用这个 jQuery.get,我会得到想要的 json 响应,那么为什么 angular 会给我 html?

  jQuery.get('/products',{search_terms:query},function(data){
     console.log(data);
  }, 'json')

我检查了网络标头,角度调用和 jQuery 调用之间的主要区别是 Angular 没有将 X-Requested-With 标头设置为“XMLHttpRequest”?

如果我添加它,那么我可以让它工作。

 $http.get('/products',{params:{search_terms:query}, responseType:'json', 'headers':{'X-Requested-With':'XMLHttpRequest'}}).success(function(data) {
  // do something
  });

但是作为 Angular 的新手,我不知道这是否是解决这个问题的正确方法。每次都必须这样做,感觉有点笨拙。有没有更好的方法,或者这就是使用 Angular 和 Rails 时的方法?

4

1 回答 1

5

我遇到了同样的事情并对此感到沮丧。我的第一个解决方案有点像警察,我最终选择了这个宝石:

https://github.com/FineLinePrototyping/angularjs-rails-resource

但是在有了更多经验之后,我发现这与角度没有设置正确的标题有关。

angular.module('yourmodule').run(['$http', function($http) {
  $http.defaults.headers.common['Accept'] = 'application/json';
  $http.defaults.headers.common['Content-Type'] = 'application/json';
}]);

参考:http ://angulartutorial.blogspot.com/2014/05/set-headers-for-all-http-calls-in.html

请记住,request.xhr 也存在这种情况

https://github.com/rails/rails/issues/16444

于 2014-10-24T16:15:30.533 回答