2

我需要在我的 ProjectBill 模型上实现一个 _to_pdf 方法,它会在这个地方生成我的账单的 PDF:

/public/xls/bills/project_#{project.number}_bill_#{bill.number}.pdf

我的应用程序使用 HTMLDoc 生成 PDF。我正在使用Rails 2.3.11。使用 HTMLDoc gem,我需要将我的部分视图_bill.pdf.haml的render_to_string传递给 HTMLDoc ,它在模型中(仅在控制器中)是不可访问的。

我的控制器中已经有一个 export_to_pdf 操作,由用户在需要导出时触发(这个操作有效)。模型方法将被一个计划任务调用,一个电子邮件发送者在 schedule_date 等于 Date.today 时发送账单。

我已经尝试了很多解决方案:

  • http://www.omninerd.com/articles/render_to_string_in_Rails_Models_or_Rake_Tasks/print_friendly
  • 在我的 ProjectBill 控制器上有一个 to_pdf 操作并从模型中调用它(但不起作用,说即使在控制器中调用了 render_to_string 也没有定义)
  • 将我的工作 export_to_pdf 方法与从我的模型发送的获取请求一起使用(但我发现我不能真正从模型发送请求......)
  • 使用带有 render_to_string 的 Helper(不起作用:未定义的方法)
  • 甚至更多!

但仍然无法正常工作。

有人可以帮我解决这个问题吗?我卡住了,找不到任何解决方案...

4

1 回答 1

2

啊,我终于做到了!

感谢您的回答 Sean,但我不是在寻找更好的 Gem,而是在寻找解决问题的方法。

出于某种原因,我无法在模型中使用 render_to_string 方法......所以我在模型上创建了 export_to_pdf 方法:

  def export_to_pdf
    bill = self
    project = self.project

    path = "facture_#{self.project.id}_#{self.bill_number}_#{Date.today.strftime('%Y_%m_%d')}.pdf"

    Plus::BillingItemsController.new._to_pdf(bill.id)

    if File.exists?(path)
      return path
    else
      return nil
    end
  end

如您所见,我在模型中调用了我的控制器。这是我的 _to_pdf 方法:

 def _to_pdf(bill_id)
    @bill = Plus::ProjectBill.find_by_id(bill_id)
    @project = @bill.project
    path = "#{RAILS_ROOT}/public/xls/facture_#{@project.id}_#{@bill.bill_number}_#{Date.today.strftime('%Y_%m_%d')}.pdf"

    av = ActionView::Base.new(Rails::Configuration.new.view_path)
    av.class_eval do
      include ApplicationHelper
      include ActionController::UrlWriter
      default_url_options[:host] = 'mysite.com'
    end

    av.extend ApplicationController.master_helper_module
    html = av.render(:partial => "/plus/billing_items/bill_for_pdf.haml", :locals => {:bill => @bill})
    data = to_pdf(html, false, {:header => '', :headfootsize => 0, :outfile => path})
  end

我的 to_pdf 函数只是执行 PDF::HTMLDoc.new 和链接、 logoimage 等的 set_option 并返回 pdf.generate

我希望这可以在某天帮助某人!

于 2012-08-17T18:20:06.577 回答