我的Users
中的每一个与has_many
都有Character
关系。现在,在他们可以使用应用程序之前,我需要他们首先选择一个角色作为他们的主要因此我想继续将它们重定向到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
答案 0 :(得分:1)
在您的MembersController
和UsersController
中,您应该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]
答案 1 :(得分:1)
我不希望通过添加另一个控制器来为我的代码行添加另一个控制器来代替我的代码: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