从ActionMailer视图在控制器中调用助手方法时发生未定义的方法错误

时间:2019-04-25 01:18:37

标签: ruby-on-rails

当我打电话

@certificate, @exp_date = certificate_with_date(@int, @coach)

在我的电子邮件模板视图中,出现以下错误:

undefined method `certificate_with_date' for #<#<Class:0x0000564473b34af8>:0x0000564473b31ec0>

在我的控制器中,我包括了

helper_method :certificate_with_date

这是有问题的方法;

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。我也从另一个视图调用此方法,并且该方法有效-由于某种原因,在此特定视图中我收到了错误消息。

1 个答案:

答案 0 :(得分:1)

您应该将助手方法移动到单独的模块中,然后使用add_template_helper方法将该模块同时包含在控制器和邮件程序中。然后,辅助方法将在控制器和邮件视图中可用。

module SomeHelper
  def some_shared_method
    # ...
  end
end

class SomeController
  add_template_helper SomeHelper
end

class SomeMailer
  add_template_helper SomeHelper
end

注意::如果将代码放入帮助程序模块(在app/helpers目录中),则无需在控制器中包含该模块,因为在默认情况下,控制器视图。但是,您仍然必须将模块包含在邮件程序中,以使该方法在邮件程序视图中可用。


如果您还需要在控制器中调用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