【发布时间】: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? && !current_user?(user)和if current_user.admin? && user != current_user会这样做,根据你的助手。所以,这取决于你,你想使用哪一个。尽量避免视图中的大量逻辑,这是一种很好的做法。 -
添加到助手。不是控制器。到 users_helper 或 application_helper。
标签: ruby-on-rails devise