2016-09-02 2 views
0

В ApplicationController, в соответствии с разработкой docs, How To: Redirect to a specific page on successful sign in and sign out, переключатель case, когда невозможно достичь, даже в консоль отладки pry, отображается «resource.class». Пользователь правда'. Я не знаю, какую часть обработки Rails я пропустил, любой намек будет оценен!В Rails 4 с чертой devise, переопределение after_sign_in_path_for недействительно

# ApplicationController.rb 
class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 


    protected 
    def after_sign_in_path_for(resource) 
    # check for the class of the object to determine what type it is 
    binding.pry 
    case resource.class 
    when User 
     puts "user redirect ==== " 
     return session.delete(:return_to) || current_user_path 
    else 
     puts "super call ....." 
     super 
    end 
    end 
end 

ответ

1

Вы довольно близко. Просто нужно получить имя класса ресурса, используя resource.class.name, чтобы вы могли сравнить его со строкой, такой как 'User', которая представляет собой не что иное, как ваше имя класса.

def after_sign_in_path_for(resource) 
    # check for the class of the object to determine what type it is 
    binding.pry 
    case resource.class.name #=>this would return the class name i.e 'User' 
    when 'User' 
    puts "user redirect ==== " 
    return session.delete(:return_to) || current_user_path 
    else 
    puts "super call ....." 
    super 
    end 
end 
1

Вы можете сделать обходной путь создания SessionsController, который наследуется от Devise::SessionsController.

class SessionsController < Devise::SessionsController 
    skip_before_filter :authenticate_user! 

    def create 
    user = User.find_for_database_authentication(email: params[:session][:email]) 

    if user && user.valid_password?(params[:session][:password]) 
     sign_in user 
     redirect_to session.delete(:return_to) || '/authorized' 
    else 
     redirect_to '/sign_in' 
    end 
    end 

    def destroy 
    sign_out :user 
    redirect_to '/signed_out' 
    end 
end 

Точка его внутри routes.rb так:

devise_for :users, controllers: {sessions: 'sessions'} 
+0

Спасибо! Я думаю, что ваш ответ может быть лучше, если вы сможете объяснить мысли, связанные с настройкой SessionController, вместо того, чтобы переопределять ApplicationController # after_sign_in_path_for. – user746403