2

我的控制器中有这个。我需要我的视图来生成一些 HTML,然后我使用Flying Saucer(我使用 JRuby)将其转换为 pdf。然后将其返回给客户端。

  def show    
    @cs_agreement = CsAgreement.find(params[:id])

    respond_to do |format|
      format.pdf do
        # TODO there must be a better way of getting the path to the view!
        report_template = ERB.new(File.new("app/views/agreement_document/client_agreement.erb"), nil, "%<")
        created_report = report_template.result(binding)

        send_data( FlyingSaucer::create_pdf(created_report), :filename => "agreement.pdf",
                   :type => "application/pdf",
                   :disposition => 'inline')
      end
    end

这是我能做的最好的……我只能弄清楚如何使用 ERB 手动生成 html,这样我就可以在返回之前检索要发送到 FlyingSaucer 的数据。

这种方式似乎也意味着我无法访问任何 Helper 方法。

有没有办法让rails为我生成html并以某种方式拦截它以在返回之前转换为pdf?渲染功能似乎只是生成并返回所有内容..

4

2 回答 2

1

您可以使用render_to_string, 如

report_template = render_to_string 'client_agreement'

与 相同的选项render。更多细节在这里

如果您需要指定不同的控制器/操作,您也可以这样做,例如通过:action => :action_name.

于 2010-03-07T04:55:59.587 回答
1

使用render_to_string.

def show    
  @cs_agreement = CsAgreement.find(params[:id])

  respond_to do |format|
    format.pdf do
      result = render_to_string
      send_data( FlyingSaucer::create_pdf(result), :filename => "agreement.pdf",
               :type => "application/pdf",
               :disposition => 'inline')
    end
  end
end
于 2010-03-07T04:59:22.933 回答