在一种方法中使用 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 以清理目录。

订单 showOrders 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" %>

要清楚:这段代码确实有效,但我是:

同样,我知道这是否不是一个合适的问题,但我没有其他人可以问,所以如果是的话请告诉我,我会记下它。我想满足这个问题的 '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 的使用经验不多,特意留下了两个问题