【问题标题】:Why is this Rails view helper logic failing in one instance but functioning in another?为什么这个 Rails 视图助手逻辑在一个实例中失败但在另一个实例中运行?
【发布时间】:2012-10-10 05:14:54
【问题描述】:

我对传入和传出 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() 的参数如何被认为是不相等的,但返回的对象(记录)被评估为相等。我在这里错过了什么?

请尝试指导您的 cmets 了解 Ruby 如何处理将对象作为参数传递或 Rails 命名约定如何在这里“提供帮助”。提前致谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我尝试使用 case.user_id 和 current_user_id 的调用参数,但是 current_user_id 抛出了错误。然后我尝试将 current_user.id 作为调用参数,但这也引发了错误。我确实了解将 User 的实例和 user_id 传递给 User.find() 可以返回相同的结果。感谢您指出 case_owned 收到的对象类型的重要区别。
    • 是的。 Owner_id 会更好。我刚试过“如果(所有者== cur_usr.id)返回true”,它工作正常。谢谢!比每次执行两个表查询要快得多。仍然不确定为什么 current_user.id 不能作为视图中的调用参数。
    猜你喜欢
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    相关资源
    最近更新 更多