从不同的视图调用模型方法
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)
), 所以你不必做一大堆额外的数据库请求来获取用户的名字。
我有模型方法
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)
), 所以你不必做一大堆额外的数据库请求来获取用户的名字。