添加/覆盖Devise的current_user方法

时间:2013-08-20 10:46:52

标签: ruby-on-rails methods devise helpers

我有一个User模型,它有一个关联的keyholder和guest。为了使我的代码更干,我想它以便current_user将引用: a)如果用户已登录,则它将是正常的Devise current_user对象。 b)如果密钥持有者已登录,则该密钥持有者的用户 - 即current_keyholder.user c)如果客人已登录,则该客人将成为该客人的用户。

我已尝试将助手添加到应用程序控制器中,但是,这些不适用于例如在我的代码运行之前,current_user没有被初始化。

基本上我想要实现的是:

  def current_user
    if user_signed_in?
      @current_user ||= warden.authenticate(:scope => :user)
    elsif keyholder_signed_in?
      @current_user = current_keyholder.user
    elsif guest_signed_in?
      @current_user = current_guest.user
    end
  end 

上面的代码给了我一个“堆栈级别太深”的错误,但希望能显示出我正在努力工作的内容。如果有人可以提供帮助,那就太棒了,谢谢!

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方法 - 在应用程序控制器中,我添加了一个名为access_user的before_filter,然后是一个名为access_user的方法:

  def access_user
    if user_signed_in?
      @access_user = current_user
    elsif keyholder_signed_in?
      @access_user = current_keyholder.user
    elsif guest_signed_in?
      @access_user = current_guest.user
    end
  end

然后,我可以在视图中使用例如<%= @access_user.id %>

如果有更好的方法或者这会导致一些安全问题,请有人告诉我吗?