从不同的视图调用模型方法

Call model method from different view

我有模型方法

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) %>

其中评论有 user_id。我得到 undefined method 'full_name_find' for #<Class:0x007fd188e41108>。只有当我将 full_name_find 方法粘贴到应用程序助手中并调用视图时,我才能让它工作:

<%= full_name_find(comment.user_id) %>

并且有效。有什么建议吗?

您可以通过将其设为 class 方法使其工作,即在其名称前加上 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"

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

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

那么,在您看来:

<%= comment.user.full_name %>

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