Ruby on rails 角度$http和Rails 4参数
我使用railsapigem来创建一个railsapi,并使用Angular为我的前端提供动力。每当我使用$http时,只有在传入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
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
如果有人能填补我仍然困惑的空白,我将不胜感激。但我希望这能帮助其他人