我有一个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方法渲染模板时,这些辅助方法不可用,有没有办法解决这个问题?
谢谢
答案 0 :(得分:2)
ApplicationController.new.render_to_string适合我
答案 1 :(得分:0)
从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
答案 2 :(得分:-1)
在这个问题上,我在墙上敲了几个小时。终于找到了add_template_helper
方法,它完成了这个技巧。
class ApplicationController < ActionController::Base
add_template_helper ApplicationHelper
...
def foo
@foo = render_to_string(partial: 'some_file.rb')
end
end
这将使ApplicationHelper
的所有方法都可用,即使使用render_to_string
部分也是如此。