【问题标题】:Ruby on rails issue with Paperclip while uploading to s3上传到 s3 时,Paperclip 出现 Ruby on rails 问题
【发布时间】:2015-12-15 11:21:35
【问题描述】:

我有一个记录模型和控制器:

require 'open-uri'
class Record < ActiveRecord::Base

  has_attached_file :record,
                    :s3_protocol => :https,
                    :url => ':s3_domain_url',
                    :path => '/record/latest/:basename.:extension'

  has_attached_file :archive_record,
                    :s3_protocol => :https,
                    :url => ':s3_domain_url',
                    :path => '/record/archive/:basename.:extension'
end


class RecordsController < ApplicationController
  def upload_record
    @error = nil
    previous_record = Record.where(:is_archive => false).first
    @new_record = Record.new(record_params)
    if @new_record.save
      unless previous_record.blank?
        if create_archive(previous_record)
          previous_record.destroy
        end
      end
      @success = I18n.t('record.success.record_uploaded')
    else
      @error = find_error(@new_record)
    end

    respond_to do |format|
      format.js {
        render :layout => false
      }
    end
  end 

  def change_record
    previous_record = Record.where(:is_archive => false).first
    archive_record = Record.where(:id => params[:id]).first
    if create_archive(previous_record) && create_current(archive_record)
      previous_record.destroy
      archive_record.destroy
    end
  end

  private

  def record_params
    params.require(:record).permit(:record_type, :record, :version, :release_date)
  end

  def create_archive(previous_record)
    archive = Record.new
    archive.archive_record = URI.parse(previous_record.record.url)
    archive.version = previous_record.version
    archive.record_file_name = previous_record.record_file_name
    archive.record_content_type = previous_record.record_content_type
    archive.is_archive = true
    @archive_record_remote_url = previous_record.record.url
    archive.save(:validate => false)
  end

  def create_current(archive_record)
    latest = Record.new
    latest.record = URI.parse(archive_record.archive_record.url)
    latest.version = archive_record.version
    latest.record_file_name = archive_record.record_file_name
    latest.record_content_type = archive_record.record_content_type
    latest.is_archive = false
    @archive_record_remote_url = archive_record.archive_record.url
    latest.save(:validate => false)
  end
end

有两个附件:最新记录和存档。

upload_record 方法上传一条记录并检查最新记录中是否存在任何其他记录(最新记录只能是一条记录,存档可以有许多条记录)。当 latest 中存在现有记录或者我们可以说是否存在当前记录时,调用 create_archive 方法将最新记录转换为存档记录并将其保存到 s3 的存档文件夹中。新上传的记录成为当前的record

有一个方法change_record,当点击任何档案上的“设为当前”按钮时调用该方法。在change_record 方法中,我使用create_archivecreate_current 两种方法将最新记录转为存档,并将点击的存档转为最新记录。

当我将任何记录转换为 archive_record 时,它已成功完成,我能够看到记录保存在 S3 中的 /record/archive/ 但是当我将存档记录转换为当前记录时,该记录没有保存在 S3 中的/record/latest/ 中。

感谢您阅读这个冗长的问题。有人可以帮帮我吗?

【问题讨论】:

  • 您说它没有保存在/record/archive 中,但您希望它保存在/record/latest 中。不确定这是错字还是问题解释的开始。
  • 对不起...已编辑
  • @user4965201 我编辑了你的拼写/语法帖子。您能否像您预期的那样仔细检查它是否仍然有意义? ;)
  • 首先,我不明白您为什么要使用 URI.parse,如果您正在解析它,那么您不必分配回形针默认变量。好像你想转储以前的文件?我说的对吗?
  • latest.record = archive_record.archive_record...这样就可以了

标签: ruby-on-rails ruby-on-rails-4 amazon-s3 paperclip


【解决方案1】:

我在我的项目中对回形针记录进行了一些深度克隆,也遇到了 URI.parse 的问题,我只是转储了现有的回形针记录,它运行良好。那么在你的情况下,这应该可以正常工作

def create_archive(previous_record)
  archive = Record.new
  archive.archive_record = previous_record.record
  archive.version = previous_record.version
  archive.is_archive = true
  @archive_record_remote_url = previous_record.record.url
  archive.save(:validate => false)
end

def create_current(archive_record)
  latest = Record.new
  latest.record = archive_record.archive_record
  latest.version = archive_record.version
  latest.is_archive = false
  @archive_record_remote_url = archive_record.archive_record.url
  latest.save(:validate => false)
end

【讨论】:

    【解决方案2】:

    我用回形针尝试过同样的事情,但它有点复杂。

    所以我更喜欢使用 rails 本身来上传文件并检索它,

    可以通过,

    <%= f.file_field :file_name %>   
    <div class="actions">
    <%= f.submit "Upload" %>   
    </div>
    

    可以通过以下方式检索,

    File.open(Rails.root.join( 'app/assets/images/', memory.original_filename), 'wb') do |file|
         file.write(memory.read)
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-23
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 2019-09-03
      • 1970-01-01
      相关资源
      最近更新 更多