Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 起源http://localhost 访问控制允许原点轨道3不允许_Ruby On Rails_Cross Domain - Fatal编程技术网

Ruby on rails 起源http://localhost 访问控制允许原点轨道3不允许

Ruby on rails 起源http://localhost 访问控制允许原点轨道3不允许,ruby-on-rails,cross-domain,Ruby On Rails,Cross Domain,接下来是这个问题,我可以从localhost到localhost:3000获取和POST 但是,DELETE和PUT 这就是我允许跨域访问的方式 class ApplicationController < ActionController::Base protect_from_forgery before_filter :allow_cross_domain_access def allow_cross_domain_access response.

接下来是这个问题,我可以从localhostlocalhost:3000获取
POST

但是,
DELETE
PUT

这就是我允许跨域访问的方式

class ApplicationController < ActionController::Base
    protect_from_forgery
    before_filter :allow_cross_domain_access
    def allow_cross_domain_access
        response.headers["Access-Control-Allow-Origin"] = "*"
        response.headers["Access-Control-Allow-Methods"] = "*"
    end
end
class ApplicationController

知道如何修复它吗?

*
不是
访问控制允许方法
响应头的有效值。您需要列出实际的方法:

response.headers["Access-Control-Allow-Methods"] = "GET, PUT, POST, DELETE"
此外,如果您的请求有任何自定义请求头,您还需要列出这些头:

response.headers["Access-Control-Allow-Headers"] = "Content-Type, X-Requested-With"
最后请注意,控制器应允许
选项
http请求。这是为了允许CORS飞行前请求,这是发出PUT或DELETE请求时所必需的。

此解决方案()适用于我:

before_filter :cors_preflight_check
after_filter :cors_set_access_control_headers

# For all responses in this controller, return the CORS 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"
end

# If this is a preflight OPTIONS request, then short-circuit the
# request, return only the necessary headers and return an empty
# text/plain.

def cors_preflight_check
  if request.method == :options
    headers['Access-Control-Allow-Origin'] = '*'
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
    headers['Access-Control-Allow-Headers'] = 'X-Requested-With, X-Prototype-Version'
    headers['Access-Control-Max-Age'] = '1728000'
    render :text => '', :content_type => 'text/plain'
  end
end
此外,您可能希望在选定的方法中启用CORS:

before_filter :cors_preflight_check, :only => [ :my_method]
after_filter :cors_set_access_control_headers, :only => [ :my_method]

如果*不是标题“access control allow methods”的有效值,我希望它能有所帮助。您能解释一下为什么Chrome在跨域请求资源时不再抛出跨域错误,而询问者问的代码在上面吗?他的代码似乎对我有用,我正试图理解什么是“正确”的方法,以及why@n00b上述代码仅适用于CORS飞行前请求。如果您的请求是一个简单的CORS请求,则不需要飞行前准备。