【问题标题】:Devise's current_user doesn't work?设计的 current_user 不起作用?
【发布时间】:2014-02-23 05:46:03
【问题描述】:

我今天相当笨拙地用 Devise gem 替换了我自己的身份验证系统(基于 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 methodcurrent_user?'`。我希望我可以做一些全球性的事情来使旧用法正常工作?

非常感谢任何指针。在我使用 Rails 的六个月里,我度过了迄今为止最糟糕的一天。

编辑: cmets 解释说我不再定义current_user?。我尝试将以下内容添加到我的 users_controller 中,但似乎没有用:

  def current_user?(user)
    user == current_user
  end

【问题讨论】:

  • 您定义了current_user,但没有定义current_user?,至少在您在此处显示的内容中。
  • Devise 中没有方法current_user?,只有current_user。如果在代码的任何地方使用它,则需要在 users_helper 或 application_helper 中自行定义。事实上,在任何帮助器中,它们都适用于任何视图和控制器。
  • 如果您使用的是 Devise,那么您使用的是会话,除非您明确更改了它的行为。但是,如果您想要 current_user?,那么可以 - 尝试一下可能会更快。
  • if current_user.admin? &amp;&amp; !current_user?(user)if current_user.admin? &amp;&amp; user != current_user 会这样做,根据你的助手。所以,这取决于你,你想使用哪一个。尽量避免视图中的大量逻辑,这是一种很好的做法。
  • 添加到助手。不是控制器。到 users_helper 或 application_helper。

标签: ruby-on-rails devise


【解决方案1】:

您使用sessions_helper 删除了您的current_user?(user) 方法。现在 Devise 为你做了所有必要的事情,但是 Devise 只有 current_user 方法,没有 current_user?(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) %>

【讨论】:

  • 谢谢。写的真好。我在那里学到了很多东西。你是一个真正的专业人士。真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2013-06-10
  • 2012-03-24
  • 1970-01-01
相关资源
最近更新 更多