【问题标题】:Call model method from different view从不同的视图调用模型方法
【发布时间】:2015-08-14 10:29:48
【问题描述】:

我有一个模型方法

def full_name_find(user_id)
   user = User.find(user_id)
   "#{user.first_name} #{user.last_name}"
end

User 模型中。我想从另一个视图(tickets#show)调用它,但我似乎无法让它工作。

我试过了:

<%= User.full_name_find(comment.user_id) %>

comment 有一个 user_id。我得到undefined method 'full_name_find' for #&lt;Class:0x007fd188e41108&gt;。只有当我将full_name_find 方法粘贴到应用程序帮助程序中并在视图中调用时,我才能让它工作:

<%= full_name_find(comment.user_id) %>

它有效。有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails ruby methods model


    【解决方案1】:

    您可以通过将其设为类方法来使其工作,即在其名称前加上self.

    def self.full_name_find(user_id)
       user = find(user_id)
       "#{user.first_name} #{user.last_name}"
    end
    
    User.full_name_find(123)
    # => "Jane Doe"
    

    ...但这很奇怪。在应该返回用户名的方法中执行数据库操作 (User.find) 是没有意义的。一个更惯用的方法是一个简单的实例方法,它可以让您获得任何用户实例的全名:

    class User < ActiveRecord::Base
      # ...
      def full_name
        "#{first_name} #{last_name}"
      end
    end
    

    那么,在你看来:

    <%= comment.user.full_name %>
    

    由于上述原因,这要好得多(更不用说更简单了),而且还因为当您加载评论时,您可以使用 includes 急切加载关联的用户(例如 Comment.where(...).includes(:user)),所以您不必执行一大堆额外的数据库请求来获取用户的姓名。

    【讨论】:

    • 是的,但我尽量避免将它写在我将使用“全名”的每个视图上。我将在哪里编写这些方法。
    • 避免写什么? comment.user.full_name?
    猜你喜欢
    • 1970-01-01
    • 2012-02-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多