为两个用户模型Rails alias_method到current_user(Devise,CanCan)

时间:2014-04-30 17:44:17

标签: ruby-on-rails-4 devise cancan

我正在使用具有两种用户类型的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而不使用别名?很高兴在需要时添加更多代码。

1 个答案:

答案 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