Ruby on rails 带有Rails后端号';访问控制允许原点';标题已存在

Ruby on rails 带有Rails后端号';访问控制允许原点';标题已存在,ruby-on-rails,ember.js,cors,ember-cli,todomvc,Ruby On Rails,Ember.js,Cors,Ember Cli,Todomvc,我试图按照《Ember入门指南》构建一个TodoMVC应用程序,但使用带有Rails的Ember CLI作为后端。不幸的是,我遇到了一个跨站点域的问题。我尝试执行post请求时收到此错误消息: XMLHttpRequest cannot load http://localhost:3000/api/todos. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://

我试图按照《Ember入门指南》构建一个TodoMVC应用程序,但使用带有Rails的Ember CLI作为后端。不幸的是,我遇到了一个跨站点域的问题。我尝试执行post请求时收到此错误消息:

XMLHttpRequest cannot load http://localhost:3000/api/todos. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.
在轨道一侧,我安装了机架COR。我已将其添加到我的文件中:

gem 'rack-cors', :require => 'rack/cors'
在我的
application.rb
文件中,我有:

module Todoemberrails
  class Application < Rails::Application
    config.assets.enabled = false

    config.middleware.use Rack::Cors do
      allow do
        origins '*'
        resource '*', headers: :any, methods: [:get, :post, :put, :delete, :options]
      end
    end
  end
end

Rails默认情况下不允许这样做,以防止跨站点脚本编写

如果要允许此访问通过主板,可以将其添加到ApplicationController:

class Api::TodosController < ApplicationController
  def index
    render json: Todo.all
  end

  def show
    render json: Todo.find(params[:id])
  end

  def create
    todo = Todo.new(todo_params)

    if todo.save
      render json: todo, status: :created
    else
      render json: todo.errors, status: :unprocessed
    end
  end

  private

  def todo_params
    params.require(:todo).permit(:title, :is_completed)
  end
end
  after_filter :cors_set_access_control_headers

  def cors_set_access_control_headers
    headers['Access-Control-Allow-Origin']      = '*'
    headers['Access-Control-Allow-Methods']     = 'POST, GET, OPTIONS'
    headers['Access-Control-Max-Age']           = '1728000'
    headers['Access-Control-Allow-Credentials'] = 'true'
  end

《灰烬入门指南》听起来不错,但对于生产应用程序来说不行。

为什么localhost:4200会发送请求?你在那里运行应用程序吗?如果是这样,将主机更改为主机:“localhost:4200/api”会有帮助吗?我使用的是Ember CLI,因此它使用自己的Web服务器来托管Ember应用程序,因此我无法将rails服务器更改为localhost:4200,因为它们不能在同一端口上运行。我无法提供解决方案,但是如果您被卡住了,我建议您查看一下
DS.ActiveModelAdapter
。与gem
活动的\u模型\u序列化程序结合使用
可以完美地工作。
  after_filter :cors_set_access_control_headers

  def cors_set_access_control_headers
    headers['Access-Control-Allow-Origin']      = '*'
    headers['Access-Control-Allow-Methods']     = 'POST, GET, OPTIONS'
    headers['Access-Control-Max-Age']           = '1728000'
    headers['Access-Control-Allow-Credentials'] = 'true'
  end