1

注文/請求書を保存できるアプリがあります。顧客の請求書を複製できる簡単な機能を構築しています。私は Order.rb モデルにこのメソッドを書きました。

請求書を取得し、関連付けられた項目を複製し、新しい OrderID をそれらに追加します...そして関連付けられた画像についても同じことを行います。

def self.duplicate_it(invoice)
  new_invoice = invoice.dup
  new_invoice.save

  invoice.lineitems.each do |l|
    new_lineitem = l.dup
    new_lineitem.order_id = new_invoice.id
    new_lineitem.save
  end

  invoice.images.each do |i|
    new_image = i.dup
    new_image.order_id = new_invoice.id
    new_image.save
  end

  return new_invoice
end

.dup残念ながら、私は S3 にイメージを保存しているため、この関連する有効期限がすべてあるため、イメージだけを保存することはできません。image_url を使用して画像を再生成する方法はありますか?

これを実行すると発生するエラーは以下のとおりです。これは、関連するすべての画像情報が正しく複製されているわけではないことを示しています。

Showing /Users/bruceackerman/Dropbox/printavo/app/views/orders/_image-display.erb where line #3 raised:

undefined method `content_type' for nil:NilClass
Extracted source (around line #3):

1:  <% @order.images.each do |image| %>
2:      <% if image.image && image.image.file %>
3:          <% if image.image.file.content_type == "application/pdf" %>
4:              <%= link_to image_tag("/images/app/pdf.jpg", 
5:                      :class => 'invoice-image'),
6:                  image.image_url, 
4

3 に答える 3

0

少し遅れていますが、これが私の解決策です。私はあまりにも多くの問題を抱えてきました.download!

if @record.duplicable?
      new_record = @record.dup
      if new_record.save
        @record.uploads.each do |upload|
          new_image = new_record.uploads.new({ uploadable_id: new_record.id })
          new_image.filename = Rails.root.join('public'+upload.filename_url).open
          new_image.save!
        end
end

これが私のupload.rb

class Upload < ActiveRecord::Base
  belongs_to :uploadable, polymorphic: true
  mount_uploader :filename, ImageUploader
end

それが役に立てば幸い!

于 2015-02-19T09:53:54.850 に答える
0

これは、注文の各項目に対して実際に行った方法です。

def self.duplicate_it(invoice)
    new_invoice = invoice.dup :include => {:lineitems => :images} do |original, kopy|
      kopy.image = original.image if kopy.is_a?(Image)
    end

    new_invoice.save!
    return new_invoice
end
于 2013-04-10T01:20:32.480 に答える