保存表单并呈现PDF

时间:2015-08-17 13:35:52

标签: javascript ruby-on-rails pdf

为什么我遇到这种情况的一些信息:

  

在我的应用程序中,用户可以更改表单和存储中的某些数据   它。也可以使用这些更改生成pdf。用户   必须保存它,再次打开对话框,现在可以打印这些更改。

     这不是一个好方法。我改成了一个动作。现在用户可以   保存更改,表单将被关闭。如果用户想要打印   更改后,他只需按下打印按钮,即可更改数据   保存,然后打印文件。

我的表单中有2个按钮,将通过ajax remote: true发送。 一个按钮是保存更改并关闭表单的默认提交按钮。

另一个按钮value=print应保存更改,呈现pdf,将其发送到浏览器,然后关闭表单。

这很好用。但看起来对我不好。

表格

<%= form_for @product, remote: true do |f| %>
  <!-- some boring fields -->
  <button class="btn btn-default glyphicon glyphicon-print" type="submit" value="pdf" name="print"></button>
  <button type="button" class="btn btn-default" data-dismiss="modal"><%=t('forms.close')%></button>
  <button class="btn btn-primary" type="submit"><%=t('forms.save')%></button>
<% end %>

在那里你可以看到两个提交按钮。

控制器操作

def show
  # just generate the pdf and render it to browser
  # render_pdf will perform the send_file method with default :attachment
  render_pdf PdfEngine.render params
end

def update
  @product = Product.find params[:id]
  # do the update logic
  render :create 
end

部分create.js.erb

<% if params[:print] %>
  location.href='<%=product_path(@product)%>'
<% else %>
  // do some blinky stuff
  // close the form and so one
<% end %>

有更好的方法来存储和存储和呈现pdf吗?

1 个答案:

答案 0 :(得分:0)

有几种不同的方法可以解决这个问题。

1)生成pdf,将其保存在您的filesytem中,并为用户提供下载pdf的链接。

2)生成pdf,将其保存在tmp位置,并使用send_file将其直接发送给用户(在浏览器中打开&#34;保存文件&#34;对话框)。

我不清楚你目前正在做哪些事。 render_pdf是将文件发送回用户,还是在浏览器中加载文件,还是做其他事情?

我认为你的问题有点过于模糊和开放性:你最好选择你想要发生的事情然后得到帮助来实现这一目标。

修改: 处理此问题的一种更好方法是让show操作在页面上以正常方式显示某些产品信息,用于html请求,并返回pdf请求的产品信息的pdf。即

def show
  @product = Product.find params[:id]
  respond_to do |format|
    format.html #default is to render the show template, let it do that
    format.pdf do 
      render_pdf PdfEngine.render params #not sure exactly what this requires from params
    end
  end
end

如果您还没有

,则需要在配置中执行此操作
#in config/initializers/mime_types.rb
Mime::Type.register 'application/pdf', :pdf

现在,您可以拥有一个定期显示页面,其中显示有关该产品的信息,并在其上显示pdf链接:

<%= link_to "Download PDF", product_path(@product, :format => "pdf") %>

另外我会让你的创建动作,如果成功,重定向到节目页面,因为这是正常的行为:

def update
  @product = Product.find params[:id]
  @updated = @product.update_attributes(params[:product])
  if @updated 
    redirect_to product_path(@product)
  else
    render :action => "edit" #or whatever
  end
end