2

ProjectBillモデルに_to_pdfメソッドを実装する必要があります。このメソッドは、次の場所で請求書のPDFを生成します。

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

私のアプリケーションはPDFを生成するためにHTMLDocを使用しています。Rails2.3.11を使用しています。HTMLDoc gemを使用して、モデル(コントローラーのみ)でアクセスできない部分ビュー_bill.pdf.hamlのrender_to_stringをHTMLDocに渡す必要があります。

私のコントローラーにはすでにexport_to_pdfアクションがあり、ユーザーがエクスポートを希望するときにトリガーされます(これは機能します)。モデルメソッドは、スケジュールされたタスクによって呼び出されます。scheduled_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が定義されていないため機能しません)
  • モデルから送信されたgetリクエストで作業中のexport_to_pdfメソッドを使用します(ただし、モデルからリクエストを実際に送信することはできないことがわかりました...)
  • その中にrender_to_stringを含むヘルパーを使用します(機能していません:未定義のメソッド)
  • そしてさらに!

しかし、まだ機能していません。

誰かがこの問題で私を助けることができますか?私は立ち往生していて、解決策を見つけることができません...

4

1 に答える 1

2

ああ、やっとやった!

ショーンの回答に感謝しますが、私はより良い宝石を探していませんでした。私は自分の問題の解決策を探していました。

何らかの理由で、モデルで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 に答える