Придумать, как перенаправить на другую страницу (на основе какого-либо параметра) после входа?

В моем приложении у меня есть две разные формы входа с двух контроллеров, которые будут входить в систему через Devise :: SessionsController, проблема в том, что после успешного входа (или сбоя) мне нужно перенаправить на разные страницы, которые относятся к контроллеру. Как я могу это сделать. В настоящее время у меня есть это в моем Devise :: SessionsController, который

class SessionsController < Devise::SessionsController
    def create
        resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#failure")
        return sign_in_and_redirect(resource_name, resource)
      end

      def sign_in_and_redirect(resource_or_scope, resource=nil)
        scope = Devise::Mapping.find_scope!(resource_or_scope)
        resource ||= resource_or_scope
        sign_in(scope, resource) unless warden.user(scope) == resource
        redirect_to dashboard_path
      end

      def failure      
        redirect_to index_path
      end
end

Ответы на вопрос(3)

after_sign_in_path_for метод в вашем контроллере, где вы хотите настроить этот путь перенаправления.

 Rn2dy23 мар. 2012 г., 08:35
Спасибо, Hck, я думаю, проблема действительно в том, как мне определить этот параметр и куда я должен передать этот параметр в after_sign_in_path, пожалуйста, помогите.
 Hck23 мар. 2012 г., 08:29
Затем вы должны создать свой собственный контроллер сессий и переопределить его в конфигурации устройства, например так:devise_for :users, :controllers => { :sessions => "users/sessions" }, В этом контроллере вы можете передавать необязательные параметрыafter_sign_in_path_forи проверить их позже, когда это необходимо. Кроме того, вы можете передать дополнительные параметры сеанса и проверить переменные сеанса в настроенномafter_sign_in_path_forили вы можете использоватьThread.current передать этот дополнительный параметр.
 Rn2dy23 мар. 2012 г., 08:26
Да, но проблема в том, как я могу предоставить параметры в after_sign_in_path_for, чтобы указать, куда идти дальше?

Сначала создайте контроллер Sessions, наследующий отDevise::SessionsController

class SessionsController < Devise::SessionsController

  def new
    get_pre_login_url(request.referer)
    super
  end

  def create
    @@referer_url
    super
  end

private

  def get_pre_login_url(url)
    @@referer_url = url
  end

  def after_sign_in_path_for(resource)
    # @@referer_url
    sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http')
    if @@referer_url == sign_in_url
      super
    else
      stored_location_for(resource) || @@referer_url || root_path
    end
  end

end

Вы заметите, что я устанавливаю переменную класса (@@variable_name), который мне не очень нравится, но это то, что я придумал после 4 часов, пытаясь решить различные другие способы. Я также стараюсь быть осторожным, чтобы не запороть с контроллером Devise слишком много и используюsuper и только включая действия, которые меня волнуют.

Далее, в маршрутах вы можете указать значения по умолчанию Devise для контроллера выше. Вам не нужно это точно так, как показано нижеdevise_forпросто часть, ссылающаяся наcontrollers: { sessions: "sessions" }

MyPortfolio::Application.routes.draw do

  devise_for :users, path_names: { sign_in: "login",
                                   sign_out: "logout" },
                    controllers: { omniauth_callbacks: "omniauth_callbacks",
                                   sessions: "sessions" }

  resources :posts do
    resources :comments
  end

  resources :projects do
    resources :comments
  end

  resources :users

  root :to => 'home#index'

  get 'login' => 'devise/sessions#new'
  get 'about_me' => 'about#index'
end

Возможно, это не самое СУЩЕСТВЕННОЕ решение, но я смог придумать единственное решение - перенаправить обратно на страницу происхождения вместо корня или бесконечного цикла.

Решение Вопроса

В контроллере приложения

  before_filter :store_location
  def store_location
    unless params[:controller] == "devise/sessions"
      url = #calculate the url here based on a params[:token] which you passed in
      session[:user_return_to] = url
    end
  end

  def stored_location_for(resource_or_scope)
    session[:user_return_to] || super
  end

  def after_sign_in_path_for(resource)
    stored_location_for(resource) || root_path
  end

Ваш ответ на вопрос