如何在调用render_to_string呈现模板时使Rails辅助方法可用

我有一个ActiveMailer类,在里面我使用render_to_string方法发送附带PDF模板的电子邮件,如下所示:

def send_sales_order(email_service) @email_service = email_service @sales_order = SalesOrder.find_by_cid(email_service.order[:id]) mail(:subject => I18n.t("custom_mailer.sales_order.subject", company_name: "test"), :to => @email_service.recipients) do |format| format.html format.pdf do attachments['purchase_order.pdf'] = WickedPdf.new.pdf_from_string( render_to_string('sales_orders/show.pdf.erb', locals: {current_company: @sales_order.company}) ) end end end 

在show.pdf.erb模板中,我调用了我在其他地方定义的辅助方法,例如在ApplicationController中定义的current_company方法,如下所示:

  class ApplicationController < ActionController::Base helper_method :current_company, :current_role def current_company return if current_user.nil? if session[:current_company_id].blank? session[:current_company_id] = current_user.companies.first.id.to_s end @current_company ||= Company.find(session[:current_company_id]) end 

但是当我使用render_to_string方法渲染模板时,这些辅助方法不可用,有没有办法解决这个问题?

谢谢

ApplicationController.new.render_to_string适合我

从Rails 5开始,您可以使用:

 rendered_string = ApplicationController.render( template: 'invoice/show', assigns: { invoice: invoice } ) 

这在像env这样的控制器中创建一个类似请求的对象,分配一个可在模板中访问的@invoice实例变量。

有关更多选项,请参阅此处的文档: http : //api.rubyonrails.org/classes/ActionController/Renderer.html#method-i-render

在这个问题上,让我在墙上拍了几个小时。 最后发现add_template_helper完成了这个伎俩。 类似的东西:add_template_helper(ApplicationHelper)