为什么这个Rails视图辅助逻辑在一个实例中失败但在另一个实例中运行?

时间:2012-10-10 05:14:54

标签: ruby-on-rails ruby ruby-on-rails-3 devise parameter-passing

我对传入和传出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命名约定如何“帮助”。我提前谢谢了!

1 个答案:

答案 0 :(得分:1)

current_user通常会返回一个User实例,如果您通过User.find(cur_user)运行该实例(它返回相同的用户),它就可以正常工作。但是,您的第一个参数是id(视图中的c.user_id)。你可以做owner == cur_user.id

如果您总是希望方法中有ID,则应该将变量命名为owner_id