我正在尝试使用Rails服务器创建RESTful服务。我在网上看过教程,显然我做错了。我的错误是CORS问题。我有一个用户模型和控制器。在我的用户控制器中,我正在尝试更改标头,以允许任何网站从服务器提取信息。
class UsersController < ApplicationController
def options
if access_allowed?
set_access_control_headers
head :ok
else
head :forbidden
end
end
private
def set_access_control_headers
# headers['Access-Control-Allow-Origin'] = request.env['HTTP_ORIGIN']
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
headers['Access-Control-Max-Age'] = '1000'
headers['Access-Control-Allow-Headers'] = '*,x-requested-with'
end
def access_allowed?
allowed_sites = '*' #you might query the DB or something, this is just an example
return allowed_sites.include?(request.env['HTTP_ORIGIN'])
return true
end
end
我还设置了我的路由,所以当服务器被命中时,它会转到'options'动作。
resources :users, :only => [:create]
match '/users', :controller => 'users', :action => 'options', :via => :get
我在我的开发机器上创建了一个html页面,我只是从Chrome打开它(我不知道这是否是一个问题。)当我试图抓住用户时,我得到了
OPTIONS http://www.*****.com:3000/users 404 (Not Found) jquery.js:3
XMLHttpRequest cannot load http://www.****.com:3000/users. Origin file:// is not allowed by Access-Control-Allow-Origin.
有人请让我知道我做错了什么,或者指出我可以帮助我的方向。
答案 0 :(得分:2)
您的路线指定接受GET
请求(:via => :get
),但看起来您的实际请求是OPTIONS
请求。
尝试将match
更改为:
match '/users', :controller => 'users', :action => 'options', :via => :options
另请注意,您的操作名称不一定是options
,也可能是您想要的名称。
供参考,以下是OPTIONS
请求should return:
返回服务器支持指定URL的HTTP方法。这可以通过请求'*'而不是特定资源来检查Web服务器的功能。
这里有an article响应Rails中的选项请求。