2013-05-15 3 views
0

Я использую Devise для аутентификации в моем приложении Rails на Heroku.devise redirect после входа в систему или выхода из системы не работает с кешированием страниц Rails

У меня есть перенаправления после входа в систему и выхода из системы, как это предлагается сделать в викторине. (https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update)

application_controller.rb:

after_filter :store_location 

def store_location 
    # store last url as long as it isn't a /users path 
    session[:previous_url] = request.fullpath unless (request.fullpath =~ /\/users\/sign_in/ || request.fullpath =~ /\/users\/sign_out/ || request.fullpath =~ /\/users\/sign_up/ || request.fullpath =~ /\/users\/edit/ || request.fullpath =~ /\/ajax_utilities/ || request.fullpath =~ /\/assets/) 
end 

def after_sign_in_path_for(resource) 
    session[:previous_url] || root_path 
end 

def after_sign_out_path_for(resource) 
    session[:previous_url] || root_path 
end 

редиректах работать нормально, пока я не включить кэширование страниц с кодом, как это:

class AboutController < ApplicationController 

    def index 
     expires_in 1.minutes, public: true 
    end 

end 

Я 99% уверен, что store_location не когда метод кэширования страниц работает в Rails, контроллер приложения никогда не будет достигнут, потому что Rack обслуживает статический HTTP, не касаясь Rails.

Есть ли у кого-нибудь идеи о том, как я могу использовать кеширование страниц Rails, а также мои перенаправления после правильной работы входа/выхода из системы?

Спасибо за любую помощь.

+0

Включает ли кеширование страницы конкретную информацию пользователя? – Swards

+0

Интересная проблема, просто любопытно, зачем вам нужен код кэширования страницы в AboutController. Попытка следовать вашим концептуальным намерениям. – fontno

+0

@Swards: кэширование страницы не содержит конкретной информации пользователя. У меня есть ajax, который загружает все содержимое для конкретного пользователя после завершения загрузки страницы. – newtorails

ответ

0

Попробуйте перед фильтром в AboutController

before_filter :destroy_cache 

def destroy_cache 
    response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate" 
    response.headers["Pragma"] = "no-cache" 
    response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" 
end 

Не уверен, что его именно то, что вам нужно, но отправная точка возможно

Взгляните на эту post и оригинальный citation

Update:

Взгляните на это article. Он покажет, как настроить дружественную переадресацию, которая звучит так, как вы хотите.

+0

hmmmm. Я не думаю, что это то, чего я хочу. Я надеюсь, что включено кэширование страниц, а не отключить кеширование в браузере. – newtorails

+0

Я не уверен, что вы пытаетесь сделать с этим. Вы просто пытаетесь настроить «дружественную переадресацию»? – fontno

+0

Предположим, что пользователь находится на моей странице контактов. Когда они нажимают ссылку для входа, они попадают на страницу входа. После успешного входа в систему они должны быть перенаправлены обратно на страницу, на которой они были, до того, как они нажали ссылку для входа, в этом случае на страницу контактов. То же самое должно быть верно для выхода из системы. Для этого Devise предоставляет удобный код для ввода, который я написал выше в контроллере приложения. К сожалению, он, похоже, не написан с учетом кэширования страниц, потому что при кэшировании страниц только nginx отвечает на запросы: код Rails никогда не выполняется. – newtorails