Rails 4回形针背景工作

时间:2014-10-05 15:05:12

标签: ruby-on-rails-4 upload paperclip

  

CURRENT LOGIC

首先,我想我已经阅读了所有关于回形针的文章,尽管学到了所有的信息,但我还是被困了......所以我可以说你的帮助真的很珍贵。

其次,我不使用delayed_pa​​perclip,也不使用s3_direct_upload(但是jquery directUpload)。

我有4个不同图片的用户个人资料:logo,avatar,worka,workb

  
      
  • 每种格式(徽标,头像,工作,工作)都有3种风格(:小,拇指,中等)
  •   
  • 用户可以更新其图片=> 因此需要更新操作
  •   
  • 4个文件字段的格式为其他经典字段(名称,电子邮件,...)
  •   
  • 上传由jQuery DirectUpload + Paperclip
  • 管理   

当用户单击文件字段以添加图像时:

  
      
  • jQuery DirectUpload将文件上传到s3
  • 上的临时目录   
  • 使用url(key)
  • 的jQuery回调   
  • 将网址指定为:temp为javascript生成的隐藏字段
  •   

按下表单提交按钮时:

  
      
  • 我在回形针上分配了直接上传文件的网址,并在@user.logo.temp的帮助下包含了网址(密钥)
  •   
  • Paperclip生成所有样式
  •   
<input type="hidden" name="user[logo_attributes][temp]" value="https://bucketname.s3.amazonaws.com/temp/e4b46d01-5d69-483b.jpg">
  

我的问题: STYLES GENERATION让我想起HEROKU IDLE和TIMEOUT#15#12

  

ATTEMPTS:我试图隔离上传过程以将其置于后台工作

我无法弄清楚如何在第一次上传时阻止回形针样式生成并在后台作业后生成它们

  
      
  • before_post_process 阻止所有后期处理,即使在后台工作中也是如此
  •   
  • 我没有使用.reprocess!自回形针4开始,更新被触发并且......无限循环... ,所以我使用 .assign .save 代替

         
        
    • 从S3托管文件正确分配文件,然后由paperclip处理
    •   
    • 我不确定文件字段中的文件,如果是否上传(在控制台中没有上传文件,但由于表单已被提交,文件也是如此,即使未使用。
    •   
  •   

  

需要:在后台工作中处理的样式已被阻止

我的徽标模型

class Logo < Document
  S3_TEMP_URL_FORMAT = %r{\/\/bucketname\.s3\.amazonaws\.com\/(?<path>temp\/.+\/(?<filename>.+))\z}.freeze

  has_attached_file :attachment,
  styles: { medium: "300x300#" },
  convert_options: { medium: "-quality 75 -strip" },
  default_url: ":parent_type/:class/:style/missing.png",
  path: "/documents/:parent_type/:id_partition/:class/:style/:basename.:extension"

  validates_attachment :attachment,
  content_type: { content_type: ["image/gif", "image/png", "image/jpg", "image/jpeg"] },
  size: { less_than: 1.megabyte }

  validates :temp, 
  # presence: true,
  format: { with: S3_TEMP_URL_FORMAT }

  before_save :set_attachment
  after_save :set_remote_url
  before_post_process :stop_process

  def stop_process
    false
  end

  def styles_process
    self.attachment.assign(attachment)
    self.save
  end

  def set_attachment
    # puts "BEGIN -- SET ATTACHMENT"
    tries ||= 5
    s3_temp_url_data = S3_TEMP_URL_FORMAT.match(self.temp)
    s3 = AWS::S3.new
    s3_temp_head = s3.buckets[ENV['S3_BUCKET']].objects[s3_temp_url_data[:path]].head
    self.attachment_file_name = s3_temp_url_data[:filename]
    self.attachment_file_size = s3_temp_head.content_length 
    self.attachment_content_type = s3_temp_head.content_type
    self.attachment_updated_at = s3_temp_head.last_modified 
  rescue AWS::S3::Errors::NoSuchKey => e
    tries -= 1
    if tries > 0
      sleep(3)
      retry
    else
      false
    end
  end

  def set_remote_url    
    s3_temp_url_data = S3_TEMP_URL_FORMAT.match(self.temp)
    s3 = AWS::S3.new
    self.attachment = URI.parse(self.temp)
    self.save
    s3.buckets[ENV['S3_BUCKET']].objects.with_prefix(s3_temp_url_data[:path]).delete_all
  end
end

我的控制器

def update
    account_update_params = devise_parameter_sanitizer.sanitize(:account_update)
    @user = User.find(current_user.id)
    if @user.update_attributes(account_update_params)
      # Here is the styles processing
      # This is where the Resque background job would go
      @user.logo.styles_process
      set_flash_message :notice, :updated
      redirect_to after_update_path_for(@user)
    else
      render :edit
    end
end

我的表格

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), method: :put, html: { class: "form-horizontal directUpload", role: "form" }) do |f| %>
    <%= f.fields_for :logo do |l| %>
      <%=   l.file_field(:attachment, accept: 'image/gif,image/png,image/jpg,image/jpeg') %>
    <% end %>
    <input type="hidden" name="user[logo_attributes][temp]" value="https://bucketname.s3.amazonaws.com/temp/e4b46d01-5d69-483b.jpg">
  <% end %>

0 个答案:

没有答案