我正在使用具有两种用户类型的Devise,Employer和Candidate彼此差异很大。目前没有STI,每个都有一个模型+设计认证。在实施CanCan授权时,我发现需要current_candidate或current_employer到current_user的别名。似乎只有一个别名可以用于current_user,因此无法对任何操作授权非别名用户类型。
class ApplicationController < ActionController::Base
alias_method :current_user, :current_candidate
#alias_method :current_user, :current_employer
#^ can't use both simultaneously!
end
上面提到雇主行动的授权,因为只有current_candidate可以别名为can_can的current_user方法中使用的current_user。
def current_ability
@current_ability ||= ::Ability.new(current_user)
end
有没有办法为CanCan有效地将两种用户类型别名变为current_user?或者是否有某种类型的before方法可以设置current_user而不使用别名?很高兴在需要时添加更多代码。
答案 0 :(得分:3)
您可以自己定义current_user
方法。例如,它可以进入ApplicationController
:
def current_user
if current_candidate # You could use candidate_signed_in? instead.
current_candidate
else
current_employer
end
end
然后它应该在所有控制器中可用,并将由CanCan的current_ability
方法使用。如果您希望它也可以在视图中使用,则可以选择将行helper_method :current_user
添加到ApplicationController
。
另一种选择是覆盖CanCan current_ability
方法,通过将其添加到ApplicationController
来提供与上述代码相同的效果:
def current_ability
@current_ability ||= ::Ability.new((candidate_signed_in?) ? currrent_candidate : current_employer)
end