Ruby on rails 角度$http和Rails 4参数

Ruby on rails 角度$http和Rails 4参数,ruby-on-rails,angularjs,Ruby On Rails,Angularjs,我使用railsapigem来创建一个railsapi,并使用Angular为我的前端提供动力。每当我使用$http时,只有在传入params而不是data时,它才会起作用。以下是尝试登录用户并创建新会话的示例: 'use strict'; app.controller('LoginCtrl', function($scope, $location, $http, tokenHandler) { $scope.login = function() { $http({ u

我使用railsapigem来创建一个railsapi,并使用Angular为我的前端提供动力。每当我使用$http时,只有在传入
params
而不是
data
时,它才会起作用。以下是尝试登录用户并创建新会话的示例:

'use strict';

app.controller('LoginCtrl', function($scope, $location, $http, tokenHandler) {
  $scope.login = function() {
    $http({
      url: 'http://localhost:3000/api/admins/sign_in',
      method: 'POST',
      params: $scope.admin
    }).success(function(data) {
      if (data.success) {
        $scope.ngModel = data.data.data;
        tokenHandler.set(data.data.auth_token);
        $location.path('/admin/blog');
      } else {
        $scope.ngModel = data;
        $scope.user.errors = data.info;
      }
    }).error(function(msg) {
      $scope.admin.errors = 'Something is wrong. Please try again.';
    });
  };
});
如果我用
data:{admin:$scope.admin}
代替params,Rails会向我抱怨
params[:admin]
为零。它似乎根本没有通过

但是,如果我使用params,我会得到以下结果:

Started POST "/api/admins/sign_in?email=raderj89@gmail.com&password=[FILTERED]" for 127.0.0.1 at 2014-09-07 20:08:04 -0400
Processing by Admin::SessionsController#create as HTML
  Parameters: {"email"=>"raderj89@gmail.com", "password"=>"[FILTERED]"}
Started OPTIONS "/api/admins/sign_in" for 127.0.0.1 at 2014-09-07 20:36:24 -0400
Processing by Admin::SessionsController#create as */*
我可以一起工作。奇怪的是,它似乎只在请求作为HTML处理时才起作用。当我使用
数据
时,我得到以下信息:

Started POST "/api/admins/sign_in?email=raderj89@gmail.com&password=[FILTERED]" for 127.0.0.1 at 2014-09-07 20:08:04 -0400
Processing by Admin::SessionsController#create as HTML
  Parameters: {"email"=>"raderj89@gmail.com", "password"=>"[FILTERED]"}
Started OPTIONS "/api/admins/sign_in" for 127.0.0.1 at 2014-09-07 20:36:24 -0400
Processing by Admin::SessionsController#create as */*
是不是应该说通过
*/*
进行处理?我认为它应该理解它应该具体地通过json进行处理

我的会话控制器如下所示:

class Admin::SessionsController < Devise::SessionsController
  skip_before_filter :verify_authenticity_token

  before_filter :authenticate_user!, except: [:create]
  respond_to :json

  # ...
end

以前有人处理过这个问题吗?

您可以发送:params或:data(我想也可以同时发送)。根据angularjs的文件

params–{Object.}–字符串或对象的映射 将在url后变为?key1=value1&key2=value2。如果值 不是字符串,它将被JSONified

数据–{string | Object}–作为请求消息数据发送的数据

控制器需要http类型的参数/表单数据,因此通过params传递对象是有效的-它会被转换,而传递相同的via:data则不会,因为它不会被转换

我不知道是否有一种聪明的方法可以在Rails控制器端解包数据格式,但是您可以使用$.param(data)将$http请求中的对象转换为序列化参数


然后在控制器上解包params[:data]。

我终于让它工作了,虽然我仍然感到困惑,但我想我已经接近了问题所在:我的Rails API中的CORS配置

据我所知,Angular默认以JSON格式发送数据。这将作为“内容类型:application/json;charset=UTF-8”处理,而在jQuery AJAX请求中,它作为“内容类型:application/x-www-form-urlencoded;charset=UTF-8”处理,并使用
$.param()
转换为查询字符串。我承认,我以前可能听过这个,但到现在为止还没有真正记录这个事实及其影响

在我的应用程序控制器中,我将CORS设置配置为:

def set_cors_headers
  headers['Access-Control-Allow-Origin'] = AppConfig.client['origin']
  headers['Access-Control-Allow-Methods'] = 'GET,POST,PUT,DELETE,OPTIONS'
  headers['Access-Control-Allow-Headers'] = '*'
  headers['Access-Control-Max-Age'] = "3628800"
end

def cors_preflight
  head(:ok) if request.method == :options
end
AppConfig
只是一个OpenStruct,它告诉我的Rails API接受来自哪个来源的请求。然后,其他一切都应该简单地设置CORS标题

出于某种原因,我仍然不确定,这对JSON请求不起作用。我从使用Angular和Rails的教程中获得了上述代码,在本教程中,他们手动剥离了资产管道,保留了Rails的所有其他内容,而Rails api剥离了一些Rails配置。这可能就是为什么在ApplicationController中设置CORS头不起作用的原因

所做的工作是使用,然后将此位添加到development.rb:

  config.middleware.use Rack::Cors do
    allow do
      origins 'localhost:9000'
      resource '*', :headers => :any, :methods => [:get, :post, :options, :delete]
    end
  end
这告诉我的应用程序接受来自localhost:9000的请求,并接受任何标题。我以为在我的ApplicationController中使用
headers['Access-Control-Allow-headers']='*'
就可以做到这一点,但我想不是。一旦我指定Rails使用这些中间件设置,一切都可以完美地工作。我的Rails API现在可以从我的Angular应用程序接受
application/json

如果有人能填补我仍然困惑的空白,我将不胜感激。但我希望这能帮助其他人