13

Ruby 1.8.7、Rails 3.0.4、PDFKit 0.5.0

ミドルウェアを使用せずにPDFKitを使用してPDFを作成しようとしているので、JavaScriptを無効にできます(PDFにあるはずの多くの情報を非表示にするアコーディオンアクションがあります)。ただし、試行すると、ビュー(show.html.erb)のパーシャルが欠落していると表示されるため、失敗します。

{:locale => [:en、:en]、:formats => [:pdf]、:handlers => [:erb、:rjs、:builder、:rhtml、:rxml]}で部分的なプログラム/詳細が欠落しています

パーシャルへの参照を削除すると、正常に機能します。また、show.html.erbと同じディレクトリにパーシャルを配置しようとしましたが無駄になりました。これが私のコントローラーのshowactionのコードです:

respond_to do |format| 
  format.html # show.html.erb 
  format.pdf {
    html = render_to_string(:template => "show.html.erb")
    kit = PDFKit.new(html, :disable_javascript => true )
    send_data(kit.to_pdf, :filename => "test_pdf", :type => "application/pdf", :disposition => 'attachment')
  }
end

これを行い、パーシャルを保持する方法はありますか?

編集:今のところ私はこれをしました:

# config/initializers/pdfkit.rb
PDFKit.configure do |config|
  config.default_options = {
    :page_size => 'Legal',
    :print_media_type => true,
    :disable_javascript => true
  }
end

これには、生成するすべてのPDFでJavaScriptをオフにするという欠点がありますが、今のところは有効です。パーシャルをrender_to_stringで引き続き機能させるという元の質問に対する回答は、引き続き高く評価されます。

4

3 に答える 3

20

私は今朝この問題に遭遇し、解決策を探しているときにあなたの質問に出くわしました。

コントローラーの抽出:

respond_to do |format|
  format.html
  format.pdf {
    html = render_to_string(:layout => false , :action => "constitution.pdf.haml")
    kit = PDFKit.new(html)
    kit.stylesheets << "#{Rails.root}/public/stylesheets/pdf.css"
    send_data(kit.to_pdf, :filename => "#{@organisation_name} Constitution.pdf",
      :type => 'application/pdf', :disposition => 'inline')        
    return
  }
end

constitution.pdf.hamlエキス:

=render :partial => 'shared/constitution'

エラー:

Missing partial shared/constitution with {:locale=>[:en, :e   ...

しばらくして壁に頭をぶつけた後、私は推測をして、次のように変更constitution.pdf.hamlしました。

=render :partial => 'shared/constitution.html.haml'

Railsについてはほんの少ししか知りません。(私の通常のHamlビューとは異なり)PDFKitにはファイル拡張子が必要なのですか?それは私のためにそれを修正しました!

于 2011-04-23T12:58:26.417 に答える
4

部分的な名前を変更する必要がないように設定:formatsすることもできます。render_to_string

html = render_to_string(:layout => false , :action => "show", :formats => :html)

これにより、残りのビューレンダリングの形式がpdfではなくhtmlになります。HTMLとPDFの応答を変更せずに同じビュー/部分を使用できるようにします。

于 2012-05-28T13:11:53.397 に答える
1

テンプレートへのフルパスを指定する必要があります。

html = render_to_string(:template => "my_view_folder_name/show.html.erb")
于 2011-04-23T13:02:30.907 に答える