我正在尝试使用Ember-CLI(ember.js)和Rails 4.2.0构建应用程序。我保持Ember和Rails代码库是分开的,所以我使用了rack-cors gem启用了CORS。当Ember应用程序向Rails api发出请求时,我不断收到以下错误:
406 Not Acceptable
和
No 'Access-Control-Allow-Origin' header is present on the requested
resource. Origin 'http://localhost:4200' is therefore not allowed access.
这是在Rails方面:
Processing by CustomersController#index as HTML
Completed 406 Not Acceptable in 2ms
ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/customers_controller.rb:9:in `index'
请求Accept标头是:
Accept:application/json, text/javascript, */*; q=0.01
我的控制器动作是:
def index
@customers = Customer.all
respond_to do |format|
format.json { render json: @customers }
#format.js { render json: @customers } Tried this too
end
end
我还有一个使用active_model_serializer gem的customer_serializer。
任何帮助将不胜感激!
答案 0 :(得分:2)
我在ember上使用rails-csrf为我的所有请求添加一个X-CSRF-Token,rails默认查找这个,所以你只需要将csrf令牌发送给ember来使其工作(不需要在轨道上更多的宝石)。 首先,您需要安装rails-csrf npm包。在你的ember cli文件夹中运行:
npm install rails-csrf --save
然后将初始化程序添加到app / app.js文件中:
loadInitializers(App, 'rails-csrf');
然后你必须生成一个应用程序路径:
ember generate route application
并为其添加一个before_model:
export default Ember.Route.extend({
beforeModel: function() {
return this.csrf.fetchToken();
}
});
如果您使用--proxy http://localhost:3000选项启动了ember服务器,则默认情况下fetchToken将在http://localhost:3000/api/csrf中查找您的csrf令牌。因此,您需要在轨道侧添加路由和控制器。
首先将命名空间路由添加到config / routes.rb文件
namespace :api do
get :csrf, to: 'csrf#index'
end
然后在app / controllers / api / csrf_controller.rb中添加csrf控制器
class Api::CsrfController < ApplicationController
def index
render json: { request_forgery_protection_token => form_authenticity_token }.to_json
end
end
现在,如果你在浏览器中运行rails并打开http://localhost:3000/api/csrf url,你应该看到带有csrf标记的json哈希。现在,所有对代理服务器的ember请求都将在X-CSRF-Token中设置csrf令牌,默认情况下,rails会显示出来。
应该是它,只要记住确保启动使用代理服务器设置到rails服务器的ember服务器,并且rails也已启用。
答案 1 :(得分:1)
我的客户需要的路线:defaults =&gt; {:format =&gt; :json}
resources :customers, :defaults => { :format => :json }
有了它就行了!