单个Rails路由上的Access-Control-Allow-Origin

Cam*_*ott 5 ruby-on-rails cors ruby-on-rails-4

在我的Rails应用程序中,我正在构建一个功能,允许用户使用Javascript代码段从其他网站上的应用程序嵌入数据.

我的Javascript片段向我的rails应用程序中的路由发出GET请求,该路由返回原始JSON.当片段和JSON共享同一个域时,一切运行良好,但是当我将片段嵌入到另一个站点时,我遇到了CORS问题.

使用我在这里找到的解决方案,我已经开始为CORS配置我的Rails应用程序.

在我的application_controller.rb:

before_filter :add_allow_credentials_headers

def add_allow_credentials_headers
    response.headers['Access-Control-Allow-Origin'] = request.headers['Origin'] || '*'   
    response.headers['Access-Control-Allow-Credentials'] = 'true'
end 

def options
    head :status => 200, :'Access-Control-Allow-Headers' => 'accept, content-type'
end
Run Code Online (Sandbox Code Playgroud)

在我的routes.rb:

get 'embed_json' => 'application#options', :via => [:options]
Run Code Online (Sandbox Code Playgroud)

但是,当我在浏览器中点击上述路径时,应用程序不再返回JSON对象 - 只是一个空白屏幕.

关于如何在单个Rails路由上最好地处理CORS似乎存在许多相互矛盾的方法.有没有"Rails方式"来处理这个要求?

Jef*_*gal 2

根据定义,调用head不会返回 JSON 。当您调用它时,选项哈希将被转换为标头。head

可以尝试这个,options调用将根据需要提供标头和空响应正文。调用index应该呈现 JSON,以及您在add_allow_credentials_headers过滤器中设置的标头。

def add_allow_credentials_headers
  response.headers['Access-Control-Allow-Origin'] = request.headers['Origin'] || '*'   
  response.headers['Access-Control-Allow-Credentials'] = 'true'
  response.headers['Access-Control-Allow-Headers'] = 'accept, content-type'
end 

def options
  head :ok
end

def index
  # do something here that renders a JSON response
end
Run Code Online (Sandbox Code Playgroud)

此外,在 Rails 应用程序上启用 CORS 的另一个选项是rack-cors,它可以满足您的需要,而无需您自己动手。