Ruby on rails 从ActionMailer视图调用控制器中的帮助程序方法时出现未定义的方法错误

Ruby on rails 从ActionMailer视图调用控制器中的帮助程序方法时出现未定义的方法错误,ruby-on-rails,Ruby On Rails,当我打电话时 @certificate, @exp_date = certificate_with_date(@int, @coach) 在我的电子邮件模板视图中,我遇到以下错误: undefined method `certificate_with_date' for #<#<Class:0x0000564473b34af8>:0x0000564473b31ec0> 这就是所讨论的方法 def certificate_with_date(num, coach)

当我打电话时

@certificate, @exp_date = certificate_with_date(@int, @coach)
在我的电子邮件模板视图中,我遇到以下错误:

undefined method `certificate_with_date' for #<#<Class:0x0000564473b34af8>:0x0000564473b31ec0>
这就是所讨论的方法

def certificate_with_date(num, coach)
    if num == 1
      return 'DBS', coach.DBS
    elsif num == 2
      return 'Safety', coach.safe_qual
    elsif num == 3
      return 'Coach', coach.coach_qual
    elsif num = 4
      return 'First Aid', coach.first_aid
    end
  end

N.B.我也从另一个视图调用此方法,它可以工作-由于某种原因,在这个特定视图中我得到一个错误。

您应该将助手方法移动到一个单独的模块中,然后使用
add\u template\u helper
方法将该模块包括在控制器和邮件程序中。然后,帮助器方法将在controller和mailer视图中可用

module SomeHelper
  def some_shared_method
    # ...
  end
end

class SomeController
  add_template_helper SomeHelper
end

class SomeMailer
  add_template_helper SomeHelper
end
注意:如果将代码放入助手模块(在
app/helpers
目录中),则无需将模块包括到控制器中,因为默认情况下,控制器视图中提供了助手模块方法。但是,您仍然需要将模块包含到邮件程序中,以使该方法在邮件程序视图中可用

module SomeHelper
  def some_shared_method
    # ...
  end
end

class SomeController
  add_template_helper SomeHelper
end

class SomeMailer
  add_template_helper SomeHelper
end

如果还需要在控制器中调用helper方法,可以使用
helpers
方法来实现,该方法允许您访问helper方法

class SomeController
  add_template_helper SomeHelper

  def some_method
    # ...
    # calling a helper method in controller 
    helpers.some_shared_method
    # ...
  end 
end
或者,您可以使用
include
方法将模块包含到控制器中,以便直接在控制器中访问这些方法

class SomeController
  include SomeHelper

  def some_method
    # ...
    # calling the included method 
    some_shared_method
    # ...
  end 
end

请将路径和名称文件写入代码的每一部分,这将有助于理解从何处调用和调用什么!非常感谢。电子邮件模板?你是说在行动邮件里?在这种情况下,您还需要将该方法放入邮件程序中。最好,你把它放到一个助手中,并将该助手包含在mailer@phoet中谢谢!我认为在控制器中显式地包含helper方法就足以在ActionMailer视图中使用。我将该方法放入了一个帮助程序中,并将add_template_helper添加到我的mailer类中,它成功了:)感谢您的详细回复,它已修复了我的错误:)