uninitialized rails constant ruby-on-rails cors

ruby-on-rails - constant - rack cors ruby on rails



Permitir cualquier cosa a través de la Política CORS (6)

¿Cómo puedo deshabilitar cors? Por alguna razón, cargué salvajemente los orígenes y encabezados permitidos, pero mis solicitudes de ajax aún se quejan de que el origen no estaba permitido por mi política de CORS ....

Mi controlador de aplicaciones:

class ApplicationController < ActionController::Base protect_from_forgery before_filter :current_user, :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-Allow-Headers''] = ''*'' 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''] = ''*'' headers[''Access-Control-Max-Age''] = ''1728000'' render :text => '''', :content_type => ''text/plain'' end end private # get the user currently logged in def current_user @current_user ||= User.find(session[:user_id]) if session[:user_id] end helper_method :current_user end

rutas:

match "*all" => "application#cors_preflight_check", :constraints => { :method => "OPTIONS" } match "/alert" => "alerts#create" match "/alerts" => "alerts#get" match "/login" => "sessions#create" match "/logout" => "sessions#destroy" match "/register" => "users#create"

Editar---

También probé:

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

en application.rb

--edit 2 ---

El problema es que las Extensiones de Chrome pueden no ser compatibles con CORS, creo. ¿Cómo puedo obtener información sin pasar por CORS? ¿Cómo debo responder a la verificación previa?


Eche un vistazo al middleware rack-cors . Controlará los encabezados CORS de forma configurable.


He tenido un problema similar antes de donde resultó ser el navegador web (Chrome en mi caso) ese fue el problema.

Si está utilizando Chrome, intente ejecutarlo de modo que:

Para ventanas:

1) Crea un acceso directo a Chrome en tu escritorio. Haga clic derecho en el acceso directo y elija Propiedades, luego cambie a la pestaña "Acceso directo".

2) En el campo "Objetivo", añada lo siguiente: -args -disable-web-security

Para Mac, abra una ventana de terminal y ejecútelo desde la línea de comandos: abra ~ / Applications / Google / Chrome.app/ -args -disable-web-security

Sobre la información de:

http://documentumcookbook.wordpress.com/2012/03/13/disable-cross-domain-javascript-security-in-chrome-for-development/


Pruebe la configuración en /config/application.rb:

config.middleware.insert_before 0, "Rack::Cors" do allow do origins ''*'' resource ''*'', :headers => :any, :methods => [:get, :post, :options, :delete, :put, :patch], credentials: true end end


Simplemente puede agregar la gema rack-cors https://rubygems.org/gems/rack-cors/versions/0.4.0

1er paso: agrega gema a tu Gemfile:

gem ''rack-cors'', :require => ''rack/cors''

y luego guardar y ejecutar la bundle install

2do paso: actualice su archivo config / application.rb agregando esto:

config.middleware.insert_before 0, Rack::Cors do allow do origins ''*'' resource ''*'', :headers => :any, :methods => [:get, :post, :options] end end

para más detalles, puede ir a rack-cors Specailly si no usa los rieles 5.


Tengo tus mismos requisitos en una API pública para la que utilicé rails-api.

También configuré un encabezado en un filtro anterior. Se parece a esto:

headers[''Access-Control-Allow-Origin''] = ''*'' headers[''Access-Control-Allow-Methods''] = ''POST, PUT, DELETE, GET, OPTIONS'' headers[''Access-Control-Request-Method''] = ''*'' headers[''Access-Control-Allow-Headers''] = ''Origin, X-Requested-With, Content-Type, Accept, Authorization''

Parece que te perdiste el encabezado de Access-Control-Request-Method.


Tuve problemas, especialmente con Chrome también. Lo que hiciste se parece esencialmente a lo que hice en mi aplicación. La única diferencia es que estoy respondiendo con un nombre de host correcto en mis encabezados CORS de origen y no un comodín. Me parece que Chrome es exigente con esto.

Cambiar entre desarrollo y producción es un problema, así que escribí esta pequeña función que me ayuda en el modo de desarrollo y también en el modo de producción. Todas las siguientes cosas suceden en mi application_controller.rb menos que se indique lo contrario, puede que no sea la mejor solución, pero los rack-cors tampoco me funcionaron, no recuerdo por qué.

def add_cors_headers origin = request.headers["Origin"] unless (not origin.nil?) and (origin == "http://localhost" or origin.starts_with? "http://localhost:") origin = "https://your.production-site.org" end headers[''Access-Control-Allow-Origin''] = origin headers[''Access-Control-Allow-Methods''] = ''POST, GET, OPTIONS, PUT, DELETE'' allow_headers = request.headers["Access-Control-Request-Headers"] if allow_headers.nil? #shouldn''t happen, but better be safe allow_headers = ''Origin, Authorization, Accept, Content-Type'' end headers[''Access-Control-Allow-Headers''] = allow_headers headers[''Access-Control-Allow-Credentials''] = ''true'' headers[''Access-Control-Max-Age''] = ''1728000'' end

Y luego tengo esta pequeña cosa en mi application_controller.rb porque mi sitio requiere un inicio de sesión:

before_filter :add_cors_headers before_filter {authenticate_user! unless request.method == "OPTIONS"}

En my routes.rb también tengo esto:

match ''*path'', :controller => ''application'', :action => ''empty'', :constraints => {:method => "OPTIONS"}

y este método se ve así:

def empty render :nothing => true end