ruby-on-rails - 从不同的 View 调用模型方法

标签 ruby-on-rails ruby methods model

我有一个模型方法

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

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

我试过:

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

其中评论有一个 user_id。我得到 undefined method 'full_name_find' for #<Class:0x007fd188e41108> .我只有坚持 full_name_find 才能让它工作方法进入应用程序助手并在 View 中调用:

<%= full_name_find(comment.user_id) %>

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

最佳答案

您可以通过将其设为类方法使其工作,即在其名称前添加 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) 没有意义。一个更惯用的方法是一个简单的实例方法,它将使您能够获得任何 User 实例的全名:

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

那么,在你看来:

<%= comment.user.full_name %>

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

关于ruby-on-rails - 从不同的 View 调用模型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30565447/

相关文章:

ruby - 当路径在 Ruby 中已知时取消链接 Tempfile

javascript - 我可以定义一个方法并为其赋值,并在对象字面量内分配其他方法吗?

ruby-on-rails - 用于 RSpec 测试的带有间隔的假日期数据

mysql - rake 测试 :prepare doesn't create test database

ruby-on-rails - 部署到 Heroku 时当前 Sidekiq 作业丢失

r - 向 data.table 添加新方法

另一个方法中的Javascript调用方法

ruby-on-rails - 乘客:启动预加载器时出错

ruby-on-rails - 组合具有相同符号值的哈希

ruby - 从具有更多值的哈希中返回键