Devise的current_user不起作用?

时间:2014-01-30 18:30:49

标签: ruby-on-rails devise

我今天非常笨拙地用Devise gem替换了我自己的auth系统(基于Michael Hartl的教程)。

我已经让大多数事情再次发挥作用,但在使用current_user方面存在很多错误。

例如,这不再起作用了:

<% if current_user.admin? && !current_user?(user) %>
    | <%= link_to "delete", user, method: :delete,
                                  data: { confirm: "You sure?" } %>
<% end %>

我以前在会话助手中定义了current_user,如下所示:

module SessionsHelper

  def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
    self.current_user = user
  end
end
      def current_user=(user)
        @current_user = user
      end

      def current_user
        remember_token = User.encrypt(cookies[:remember_token])
        @current_user ||= User.find_by(remember_token: remember_token)
      end

      def current_user?(user)
        user == current_user
      end

我已经废除了它,认为设计提供了相同的功能,但似乎并非如此。在我以前使用current_user的几乎所有情况下,我现在得到undefined method current_user?'`。我希望有一些全球性的东西可以让旧的用法发挥作用吗?

任何指针都非常感激。到目前为止,在我使用它的六个月里,我已经度过了最糟糕的一天。

编辑:评论说明我不再定义current_user?。我已经尝试将以下内容添加到我的users_controller中,但它似乎没有起作用:

  def current_user?(user)
    user == current_user
  end

1 个答案:

答案 0 :(得分:1)

您已使用current_user?(user)删除了sessions_helper方法。现在Devise为您做了所有必要的工作,但Devise只有current_user方法,没有current_user?(user)

您可以在任何助手中自行定义,所有这些方法都适用于任何视图和任何控制器。

事实上,如果您有许多条件,您需要检查用户是否为admin,而user不是current_user。你可以为它做一个单独的帮助。但是,正如我从Michael Hartl的教程中记得的那样,没有太多这样的块(:

类似的东西:

def not_admin?(user)
  current_user.admin? && !current_user?(user)
end

所以,你可以重构你的观点:

<% if not_admin?(user) %>
    | <%= link_to "delete", user, method: :delete,
                                  data: { confirm: "You sure?" } %>
<% end %>

您还可以通过以下方式更清楚地了解:

| <%= link_to "delete", user, method: :delete,
              data: { confirm: "You sure?" } if not_admin?(user) %>