我对传入和传出Rails视图助手的参数和结果的处理感到困惑:
module CasesHelper
def case_owned(owner,cur_usr)
return false if (owner.nil?)
return false if (cur_usr.nil?)
x = User.find(cur_usr)
y = User.find(owner)
## this does not returns 'true'
## when expected
## return true if (owner == cur_usr)
return true if (x == y) #<<<< This line works
return false
end
end
这是视图代码:
<td><%= link_to 'Show', c %></td>
<td><%= (link_to 'Edit', edit_case_path(c)) if case_owned(c.user_id,current_user) %></td>
<td><%= (link_to 'Destroy', c, method: :delete, data: { confirm: 'Are you sure?' }) if case_owned(c.user_id,current_user) %></td>
工作代码如何工作,注释掉的行怎么办?为什么User.find()调用必须确保相等。而且,怎么可能:
User.find(cur_usr) == User.find(owner)
...评估为true
何时:
cur_usr == owner
...评估为false
我正在使用Devise gem进行身份验证,它正在提供current_user方法。我最初用“cur_usr == owner”行编写了上面的代码,但是使用User.find()方法实现了。让我感到困惑的是,传递给find()的参数如何被认为是不相等的,但返回的对象(记录)被评估为相等。我在这里缺少什么?
请尝试将您的评论指向Ruby如何将对象作为参数传递,或者Rails命名约定如何“帮助”。我提前谢谢了!
答案 0 :(得分:1)
current_user
通常会返回一个User
实例,如果您通过User.find(cur_user)
运行该实例(它返回相同的用户),它就可以正常工作。但是,您的第一个参数是id(视图中的c.user_id
)。你可以做owner == cur_user.id
。
如果您总是希望方法中有ID,则应该将变量命名为owner_id
。