2

我的每一个人Usershas_manyCharacter。现在,在他们可以使用应用程序之前,我需要他们首先选择一个角色作为他们的主要角色,因此我想继续将他们重定向到members控制器显示方法,直到他们选择主要角色。

我的方法有效,但是当有人想在选择主要角色之前注销时会出现问题,它会不断将他们重定向到member_path. 如何将devise控制器添加到此规则和整个members控制器的例外中。

class ApplicationController < ActionController::Base
  protect_from_forgery

    before_filter :check_for_main
    skip_before_filter :check_for_main, :only => [:members => :show, :users => :sign_out]

    # Check if user has a main character selected
    private
    def check_for_main

        # Check signed in user
        if user_signed_in?

            # Check associated characters if any are set as main
            redirect_to member_path(current_user.id), :alert => "Please select your main character."
            unless current_user.characters.any?(&:main)

            end
        end
    end

end
4

2 回答 2

1

在你MembersControllerUsersController你都应该有skip_before_filter :check_for_main一个:only选项来指定那些控制器中的哪些操作应该跳过过滤器。你目前有

skip_before_filter :check_for_main, :only => [:members => :show, :users => :sign_out]

但这应该是

# in MembersController
skip_before_filter :check_for_main, :only => [:show]

# in UsersController
skip_before_filter :check_for_main, :only => [:sign_out]    
于 2013-03-23T18:02:29.023 回答
1

我不想通过将另一个控制器添加到子类 Devise 控制器来污染我的代码,只是为了那一行:skip_before_filter. 我的第一次尝试是添加skip_before_filter自己的控制器来设计控制器,但你真的应该避免这种情况。

无论如何运行rake routes表明设计控制器实际上devise/controller_name总是以devise/ prefix名称之前的名称命名。由于我不打算进一步扩展设计控制器,唯一有意义的事情是向它自己的方法添加一个条件语句以跳过来自设计包的请求。

对于我所有的其他控制器,我遵循@Stuart M了建议。

我的新代码:

class ApplicationController < ActionController::Base
    protect_from_forgery

    before_filter :check_for_main

    # Check if user has a main character selected
    private
    def check_for_main

        # Check signed in user
        if user_signed_in?

            if not params[:controller].to_s.include? "devise"
                # Check associated characters if any are set as main
                if not current_user.characters.any?(&:main)
                    redirect_to member_path(current_user.id), :alert => "Please select your main character."
                end
            end
        end
    end

end
于 2013-03-26T14:50:06.707 回答