【问题标题】:Error passing object to method using send() in Ruby在 Ruby 中使用 send() 将对象传递给方法时出错
【发布时间】:2015-10-09 18:40:23
【问题描述】:

我在使用send() 调用方法时遇到问题,同时将所述方法传递给对象。我收到undefined method ``employee_feedback(#<WorkItem:0x000000057cc7c0>)' for WorkItemMailer:Class 错误。

这是在我的 work_item.rb 模型中:

  def send_work_item_mail
    forms_needing_mail = ["employee", "install", "repair"]
    if forms_needing_mail.include?(self.form)
      WorkItemMailer.send("#{self.form}_feedback(#{self})").deliver_now
    end
  end

被称为:

  @work_item.send_work_item_mail 

在我的 work_items_controller.rb 中

以下是我邮件中的方法:

  def employee_feedback(work_item)
    @work_item = work_item
    @employee  = User.find_by(id: @work_item.employee)
    @manager   = User.find_by(id: @employee.manager)
    mail to: @manager.email, subject: "Employee feedback for #{@employee.name}"
  end

是我使用的发送不正确,还是这里有其他问题?

【问题讨论】:

  • `` 是错字还是出现在异常中?如果不是错字,这就是问题所在。
  • 错字。在将其粘贴到我的解释中时添加它,因为 ` 正在阻止代码格式正常工作。
  • 元编程标签应该被移除。 send 是最基础的。
  • @CarySwoveland:嗯,不是那么基本。但是,是的,远非“元”。
  • @Sergio,我一直认为puts "It's a fine day"send(:puts, "It's a fine day.") 的语法糖(用于公共方法)。

标签: ruby-on-rails ruby metaprogramming


【解决方案1】:

试试这个

WorkItemMailer.send("#{self.form}_feedback".to_sym, self).deliver_now

【讨论】:

  • 谢谢。不幸的是,仍然收到同样的错误。
  • 如果您从控制台运行 WorkItemMailer.send("employee_feedback(#{WorkItem.first})").deliver_now 会出现错误?
  • 当然可以 - NoMethodError: undefined method ``employee_feedback(WorkItem.first)' for WorkItemMailer:Class
  • 看起来问题出在send() 寻找整个字符串作为方法,而不是将对象作为参数传递 - 它将对象 ID 作为字符串作为方法调用的一部分传递。
  • 糟糕,我打错字了(忘记了 #{}),但我从控制台收到了与以前相同的错误
【解决方案2】:

在对象上调用send 与直接调用方法相同。不同之处在于您将方法名称作为参数传递给send。 后续要发送的参数(在方法名称之后)作为方法中的参数传递

所以这个:

WorkItemMailer.employee_feedback(self)

应该被称为:

WorkItemMailer.send(:employee_feedback, self)

在你的情况下:

WorkItemMailer.send("#{self.form}_feedback", self).deliver_now

【讨论】:

  • 太好了,谢谢。效果很好。虽然不需要将它作为数组传递 - 只是 self 工作正常。
  • 数组怎么了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
相关资源
最近更新 更多