在一种方法中使用 CombinePDF/Prawn/Paperclip
Using CombinePDF/Prawn/Paperclip all in one method
所以我不确定这对 Whosebug 来说是否是一个合适的问题,但没有其他人可以求助,我想我会在这里尝试。
现在,下面的代码可以达到预期目的。但是,我认为自己是 Rails 的新手,没有经验可以预见未来随着我的应用程序扩展可能出现的任何后果。
所以思路是当用户点击'Generate PDF'按钮时,Prawn会生成自定义PDF,CombinePDF 将这个和来自相关来源的 PDF 合并,然后最终的 PDF 将被保存到 Rails.root 目录(只是因为我不知道如何将保存位置传递给 CombinePDF 并到处搜索),然后 Paperclip 会将其附加到相应的模型上,然后删除 Rails.root 中生成的原始 PDF 以清理目录。
订单 show
在 Orders Controller
中的操作
def show
@orders = Order.find(params[:id])
@properties = Property.find(@orders.property.id)
@deeds = Deed.where(property_id: @properties, order_id: @orders).all
@mortgages = Mortgage.where(property_id: @properties, order_id: @orders).all
@attached_assets = AttachedAsset.where(property_id: @properties, order_id: @orders).all
@owners = Owner.where(property_id: @properties, order_id: @orders).all
respond_to do |format|
format.html
format.pdf do
order_pdf = OrderPdf.new(@orders, @properties, @deeds, @mortgages, @attached_assets).render
combine_order_pdf = CombinePDF.new
combine_order_pdf << CombinePDF.parse(order_pdf)
if @deeds.any?
@deeds.each do |deed|
combine_order_pdf << CombinePDF.load(deed.document.path)
end
end
if @mortgages.any?
@mortgages.each do |mtg|
combine_order_pdf << CombinePDF.load(mtg.document.path)
end
end
if @attached_assets.any?
@attached_assets.each do |assets|
combine_order_pdf << CombinePDF.load(assets.asset.path)
end
end
combine_order_pdf.save "order_#{@orders.order_number}.pdf"
paperclip_pdf = File.open("order_#{@orders.order_number}.pdf")
@orders.document = paperclip_pdf
@orders.save
File.delete("order_#{@orders.order_number}.pdf")
redirect_to property_order_path(@properties, @orders)
flash[:success] = "PDF Generated Successfully. Please scroll down."
end
end
end
Orders show view
中的生成 PDF 按钮
<%= link_to fa_icon("files-o"), order_path(@orders, format: "pdf"), class: "m-xs btn btn-lg btn-primary btn-outline" %>
要清楚:这段代码确实有效,但我问是:
- 所有这些逻辑在控制器功能中是否合适,或者有更好的地方吗?
- 这个过程会不会成为我申请的瓶颈?
- 在CombinePDF/Prawn完成他们的工作后,有没有更好的方法直接保存到Paperclip?
- 我能否将保存位置传递给 CombinePDF,使其不在 Rails.root 中?
- 将回形针附件存储在 Rails。root/public 是让它们能够 accessed/displayed 在 内部网 上的唯一方法 Rails应用程序?
- 关于此方法,是否有任何我没有发现的问题可能会使我的应用程序面临性能、安全性或稳定性方面的风险?
同样,我知道这是否不是一个合适的问题,但我没有其他人可以问,所以如果是的话请告诉我,我会记下它。我想满足这个问题的 'Answerable' 标准的是任何可以告诉我 rails 这样做的方法以及为什么 and/or 回答上述问题的人。在此先感谢您的任何输入!
所有这些逻辑在控制器功能中是否合适,或者有更好的地方吗?
是的,理想情况下,您的动作应该是 7-8 行,剩下的部分可以成为另一个动作,或者进入一个模块,您可以将其放在关注文件夹中。例如:您可以取出 pdf 逻辑并在文件名为 orders_related.rb
的 concerns
文件夹中编写另一个方法
module OrdersRelated
def self.parsing_pdf(orders, properties, deeds, mortgages, attached_assets)
order_pdf = OrderPdf.new(orders, properties, deeds, mortgages, attached_assets).render
.
.
@orders.document = paperclip_pdf
@orders.save
File.delete("order_#{@orders.order_number}.pdf")
redirect_to property_order_path(@properties, @orders)
end
end
这个过程会不会成为我的申请瓶颈?
是的,这种处理应该总是在后台进行。不会详细说明您应该使用哪个,因为这取决于您的要求。
将回形针附件存储在 Rails.root/public 中是让它们能够 accessed/displayed 在内联网 Rails 应用程序中的唯一方法吗?
不,您应该使用像 s3 bucket
这样的存储服务来保存您的文件。这样做有很多好处,这又超出了这个问题的范围。
关于此方法,是否有任何我没有发现的问题可能会使我的应用程序面临性能、安全性或稳定性风险?
是的,你的方法显然需要大量重构我可以建议很少
- 从所有不需要的查询中删除
.all
- 在所有 table
中将 index
添加到这些列(属性,顺序)
- 切勿将重要文件保存到您的 public 目录(使用第三方存储服务)
p.s: 由于我对 CombinePdf 的使用经验不多,特意留下了两个问题
所以我不确定这对 Whosebug 来说是否是一个合适的问题,但没有其他人可以求助,我想我会在这里尝试。
现在,下面的代码可以达到预期目的。但是,我认为自己是 Rails 的新手,没有经验可以预见未来随着我的应用程序扩展可能出现的任何后果。
所以思路是当用户点击'Generate PDF'按钮时,Prawn会生成自定义PDF,CombinePDF 将这个和来自相关来源的 PDF 合并,然后最终的 PDF 将被保存到 Rails.root 目录(只是因为我不知道如何将保存位置传递给 CombinePDF 并到处搜索),然后 Paperclip 会将其附加到相应的模型上,然后删除 Rails.root 中生成的原始 PDF 以清理目录。
订单 show
在 Orders Controller
def show
@orders = Order.find(params[:id])
@properties = Property.find(@orders.property.id)
@deeds = Deed.where(property_id: @properties, order_id: @orders).all
@mortgages = Mortgage.where(property_id: @properties, order_id: @orders).all
@attached_assets = AttachedAsset.where(property_id: @properties, order_id: @orders).all
@owners = Owner.where(property_id: @properties, order_id: @orders).all
respond_to do |format|
format.html
format.pdf do
order_pdf = OrderPdf.new(@orders, @properties, @deeds, @mortgages, @attached_assets).render
combine_order_pdf = CombinePDF.new
combine_order_pdf << CombinePDF.parse(order_pdf)
if @deeds.any?
@deeds.each do |deed|
combine_order_pdf << CombinePDF.load(deed.document.path)
end
end
if @mortgages.any?
@mortgages.each do |mtg|
combine_order_pdf << CombinePDF.load(mtg.document.path)
end
end
if @attached_assets.any?
@attached_assets.each do |assets|
combine_order_pdf << CombinePDF.load(assets.asset.path)
end
end
combine_order_pdf.save "order_#{@orders.order_number}.pdf"
paperclip_pdf = File.open("order_#{@orders.order_number}.pdf")
@orders.document = paperclip_pdf
@orders.save
File.delete("order_#{@orders.order_number}.pdf")
redirect_to property_order_path(@properties, @orders)
flash[:success] = "PDF Generated Successfully. Please scroll down."
end
end
end
Orders show view
<%= link_to fa_icon("files-o"), order_path(@orders, format: "pdf"), class: "m-xs btn btn-lg btn-primary btn-outline" %>
要清楚:这段代码确实有效,但我问是:
- 所有这些逻辑在控制器功能中是否合适,或者有更好的地方吗?
- 这个过程会不会成为我申请的瓶颈?
- 在CombinePDF/Prawn完成他们的工作后,有没有更好的方法直接保存到Paperclip?
- 我能否将保存位置传递给 CombinePDF,使其不在 Rails.root 中?
- 将回形针附件存储在 Rails。root/public 是让它们能够 accessed/displayed 在 内部网 上的唯一方法 Rails应用程序?
- 关于此方法,是否有任何我没有发现的问题可能会使我的应用程序面临性能、安全性或稳定性方面的风险?
同样,我知道这是否不是一个合适的问题,但我没有其他人可以问,所以如果是的话请告诉我,我会记下它。我想满足这个问题的 'Answerable' 标准的是任何可以告诉我 rails 这样做的方法以及为什么 and/or 回答上述问题的人。在此先感谢您的任何输入!
所有这些逻辑在控制器功能中是否合适,或者有更好的地方吗?
是的,理想情况下,您的动作应该是 7-8 行,剩下的部分可以成为另一个动作,或者进入一个模块,您可以将其放在关注文件夹中。例如:您可以取出 pdf 逻辑并在文件名为 orders_related.rb
concerns
文件夹中编写另一个方法
module OrdersRelated
def self.parsing_pdf(orders, properties, deeds, mortgages, attached_assets)
order_pdf = OrderPdf.new(orders, properties, deeds, mortgages, attached_assets).render
.
.
@orders.document = paperclip_pdf
@orders.save
File.delete("order_#{@orders.order_number}.pdf")
redirect_to property_order_path(@properties, @orders)
end
end
这个过程会不会成为我的申请瓶颈?
是的,这种处理应该总是在后台进行。不会详细说明您应该使用哪个,因为这取决于您的要求。
将回形针附件存储在 Rails.root/public 中是让它们能够 accessed/displayed 在内联网 Rails 应用程序中的唯一方法吗?
不,您应该使用像 s3 bucket
这样的存储服务来保存您的文件。这样做有很多好处,这又超出了这个问题的范围。
关于此方法,是否有任何我没有发现的问题可能会使我的应用程序面临性能、安全性或稳定性风险?
是的,你的方法显然需要大量重构我可以建议很少
- 从所有不需要的查询中删除
.all
- 在所有 table 中将
- 切勿将重要文件保存到您的 public 目录(使用第三方存储服务)
index
添加到这些列(属性,顺序)
p.s: 由于我对 CombinePdf 的使用经验不多,特意留下了两个问题