2014-03-03 74 views
0

我有一个Rails v4.0.2应用程序设置并在Heroku上托管。我暂时禁用了CSRF真实性令牌检查,以允许从外部来源POST JSON数据。当我在Chrome中使用高级REST客户端扩展进行POST时,它可以正常工作并创建新记录。然而,试图在JavaScript中创建完全相同的POST与Ajax调用的时候,我收到以下错误:Rails POST与跨域XMLHttpRequest

OPTIONS http://herokudomain.com/users.json 404(未找到)

OPTIONS http://herokudomain.com/users.json否“访问控制 - 允许 - Origin'标题出现在请求的资源上。因此不允许访问原产地'http://requestdomain.com'。

XMLHttpRequest无法加载http://herokudomain.com/users.json。请求的资源上没有“Access-Control-Allow-Origin”标题。因此不允许访问原产地'http://requestdomain.com'。

我特别不理解404错误,因为我确实使用了正确的URL,虽然我在此为了演示而更改了它。如果我将错误消息中的URL复制到浏览器中,我将转到所需的页面,而不是404.

是否有人可以帮助启发我使用高级REST客户端的差异,以及在JavaScript中使用XMLHttpRequest,以及如何解决此问题?

EDITS:

这里是我的测试页,我已经尝试过通过本地主机和托管域中运行的代码:http://pastebin.com/z3hJEX8c

回答

1

在应用程序控制器添加这些行会允许跨域请求,但为了安全,您可以定义域名

before_filter :allow_ajax_request_from_other_domains 

def allow_ajax_request_from_other_domains 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Request-Method'] = '*' 
    headers['Access-Control-Allow-Headers'] = '*' 
end 
+0

我已经有了类似的东西,除了最后一行'Access-Control-Allow-Headers'。我已经添加了它,仍然继续得到相同的错误。我应该指定我正在使用Rails v4.0.2,因为我在Stack Overflow上看到的其他问题似乎表明不同版本的Rails有不同的解决方案。 – badgercore

+0

这是在rails 3.2上工作,但我没有在rails4上试过它我在1周内遇到了这个问题,我认为CRFS标记也会出现这个问题,试着在应用程序控制器中取消注释protect_from_forgery,如果它工作的话,我会提供给你使代码正常工作 –

+0

我已经将应用程序控制器中的protect_from_forgery行注释掉了,这使得它可以在Chrome中使用高级REST客户端扩展。由于某些原因,使用JavaScript时它的行为不同,我仍然收到这些错误。 – badgercore