2013-11-27 128 views
1

我正在关注Ruby on Rails教程Michael Hartl。我已经到了第9章。有些代码我不明白。请参阅下面的第4行,为什么我们需要在current_user?(user)之前需要!来制作它!current_user?(user)我们不需要true && true if语句通过,所以Admin可以看到删除操作。Ruby on Rails教程Michael Hartl第9章(代码9.43)

如果用户登录并且是管理员,则current_user.admin? == true,current_user?(user) = true!current_user?(user)将为false,if语句将不会通过。

_user.html.erb

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

sessions_helper.rb

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 

在此先感谢。

回答

2

只有管理员可以删除用户,他们不能删除自己。

railstutorial.org章9.4:

管理用户应该看到这样的链接,并通过点击删除链接,我们希望管理员删除用户

还要注意,我们添加了一个测试来验证管理员没有看到自己删除的链接

所以:

current_user.admin?意味着 “是当前用户的管理员吗?”

!current_user?(user)意思是“当前用户与我显示的用户不同吗?”

放在一起,<% if current_user.admin? && !current_user?(user) %>作为显示Delete链接的测试意味着删除链接仅针对管理员显示,而不显示其自己的user详细信息。也就是说,只有管理员可以删除用户,他们不能删除自己。

请记住,用户视图正在显示用户列表,而不仅仅是当前用户。在这种情况下,user意味着当时视图正在显示的用户模型。

检查this image并注意Example User没有删除链接,但其他人都这样做。

+0

你能解释一下这个代码如果是current_user.admin,那么'<%? &&!current_user?(user)%>'=只有管理员可以删除用户,他们不能删除自己。谢谢 – Jimmy

+0

cos'true && true => true'和'true && false => false',如果管理员看到'true && false',管理员如何看到删除操作? – Jimmy

+0

更新的答案与进一步的解释 –

相关问题