Ember-CLI和Rails:没有'Access-Control-Allow-Origin'标头错误

时间:2015-01-27 00:17:44

标签: ruby-on-rails ruby-on-rails-4 ember.js

我正在尝试使用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。

任何帮助将不胜感激!

2 个答案:

答案 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 }

有了它就行了!