我今天非常笨拙地用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
答案 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) %>