为什么我遇到这种情况的一些信息:
在我的应用程序中,用户可以更改表单和存储中的某些数据 它。也可以使用这些更改生成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吗?
答案 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