2013-11-09 5 views
3

Я построил рельсы, которые я обслуживаю Heroku и Angular client, которые я пытаюсь запустить с моей локальной машины. В конце концов этот клиент будет запущен в проект phonegap. Тем не менее, на данный момент я тестирую приложение в chrome и т. Д., И мой браузер продолжает возвращать ошибку ниже.Heroku Rails CORS issue

XMLHttpRequest cannot load Origin http://localhost is not allowed by Access-Control-Allow-Origin. 

Это сообщение об ошибке, которое я получаю. Перед этим я столкнулся с этой проблемой, прежде чем подтолкнуть ее к Хероку и разрешить ее, добавив к моим ответам заголовки доступа.

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'] = 'http://localhost' #* 
     headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
     headers['Access-Control-Allow-Headers'] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(',') 
     headers['Access-Control-Max-Age'] = "1728000" 
end 

Это не работает. По какой-то причине это не работает с Heroku. Кто-нибудь знает, как решить эту проблему?

+0

вы решили проблему? У меня то же самое ... – Featalion

+0

yep ... я отправлю ответ ниже – Lampbo

ответ

2
class ApplicationController < ActionController::Base 
protect_from_forgery 
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-Allow-Headers'] = %w{Origin Accept Content-Type X-Requested-With auth_token X-CSRF-Token}.join(',') 
    headers['Access-Control-Max-Age'] = "1728000" 
end 

def cors_preflight_check 
    if request.method == "OPTIONS" 
    headers['Access-Control-Allow-Origin'] = 'http://localhost' 
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
    headers['Access-Control-Allow-Headers'] = %w{Origin Accept Content-Type X-Requested-With auth_token X-CSRF-Token}.join(',') 
    headers['Access-Control-Max-Age'] = '1728000' 
    render :text => '', :content_type => 'text/plain' 
    end 
end 
end 

Это похоже на трюк.

+0

Да, я видел это решение, но мне оно не нравится. Я добавлю ниже мое решение. – Featalion

6

Одно из возможных решений для Rails 4 (не проверял более ранние версии). Я использовал rails-api для создания автономного сервера API. Итак, пример основан на ActionController::API. То же самое решение должно работать нормально при использовании ActionController::Base.

# app/controllers/application_controller.rb 
class ApplicationController < ActionController::API 
    include ActionController::ImplicitRender 
    include ActionController::MimeResponds 

    def cors_preflight_check 
    headers['Access-Control-Max-Age'] = '1728000' 

    render json: {} # Render as you need 
    end 
end 


# config/application.rb 
class Application < Rails::Application 
    config.action_dispatch.default_headers = { 
    'Access-Control-Allow-Origin' => '*', 
    'Access-Control-Allow-Methods' => 'POST, PUT, PATCH, DELETE, GET, OPTIONS', 
    'Access-Control-Request-Method' => '*', 
    'Access-Control-Allow-Headers' => 'Origin, X-Requested-With, Content-Type, Accept, Authorization' 
    } 
end 


# config/routes.rb 
# Last route definition code line 
match '*path', to: 'application#cors_preflight_check', via: [:options] 

Это решение кажется менее хакерским для меня. Кроме того, он заботится о методе HTTP OPTIONS в «Rails-way».

+0

Спасибо Featalion, он работает для меня, хотя я не знаю, может ли это вызвать некоторые проблемы с безопасностью. Я только изменил файл config/application.rb, а затем сделал простой XMLHttpRequest с моего http: // localhost. – wagyaoo

+0

Ничего себе, после поиска того, что кажется днями для решения общей проблемы CORS с героикой, я наткнулся на это, и вот! ОНО РАБОТАЕТ! Спасибо, Featalion. – eplewis89

+0

Работает отлично с Rails 5 тоже –