返回前处理生成视图的最佳方法

时间:2010-03-07 04:51:21

标签: ruby-on-rails render

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

  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?渲染函数似乎只生成并返回一个..

2 个答案:

答案 0 :(得分:1)

您可以使用render_to_string,如

report_template = render_to_string 'client_agreement'

render相同的选项。更多详情here

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

答案 1 :(得分: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