用于导轨4的回形针定制作物

时间:2014-10-14 21:59:53

标签: ruby-on-rails heroku paperclip

我看了很多Paperclip裁剪教程,我不知道我做错了什么,但我无法让它为我工作。这些教程都已过时,所以我想知道这是不是问题......

我使用的最新教程是here,但我得到的错误并不具有描述性。我得到了

An error was received while processing: #<Paperclip::Error: There was an error processing the thumbnail for 1dc9f9eee29a7fd2f3f68e9c264b6d5420141014-13-v9mj79

后面跟着Heroku上的Rollback并且:

ActionView::MissingTemplate (Missing template profiles/failed to update, application/failed to update with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby]

我没有任何观点,因为这只是我移动应用的服务器端。我假设后一个错误没有关联,因为它在回滚后出现,但我可能会弄错。

从我的移动应用程序发送到我的控制器的数据格式为:

Parameters: {"profile"=>{"picture1_url"=>"http://a_url_here.com/sdfsdf.jpg", "crop_x"=>384, "crop_y"=>0, "crop_w"=>201, "crop_h"=>182}, "id"=>"123"}

最后,我的代码列在下面。我做错了什么阻止了我的种植?或者可以将命令传递到模型的has_attached_file,以便我甚至不使用处理器?在我的模型中有类似的东西:

# I tried this already and it didn't work but is there some other way to do this? 
# Also keep in mind I will need to pass variables crop_y,crop_x, etc.
has_attached_file :picture1, styles: {
  crop: "-crop '#{crop_w}x#{crop_h}+#{crop_x}+#{crop_y}" 
}

我的实际代码如下:

我的模型profile.rb

has_attached_file :picture1, styles: {
  crop: {processors: [:cropper]}
}, url: "pictures/:facebook_id/:style/1:dotextension",
path: ":rails_root/public/:url"

attr_accessor :crop_x, :crop_y, :crop_w, :crop_h

我的控制器profiles_controller.rb

def profile_params
    # I have other things I permit but only showing the crop values
    params.require(:profile).permit(:crop_w,:crop_x,:crop_h,:crop_y)
end

我的处理器cropper.rb

module Paperclip
  class Cropper < Thumbnail
    def initialize(file, options = {}, attachment = nil)
      super
      @current_geometry.width = target.crop_w
      @current_geometry.height = target.crop_h
    end
    def target
      @attachment.instance
    end
    def transformation_command
      crop_command = ["-crop","#{target.crop_w}x#{target.crop_h}+#{target.crop_x}+#{target.crop_y}"]
      crop_command + super
    end
  end
end

1 个答案:

答案 0 :(得分:0)

问题是处理器无法识别target.crop_w等。

我无法弄清楚如何在处理器中识别target.crop_w

最后,我通过lambda实例将变量传递给样式。例如:

has_attached_file :picture1, styles: lambda {|a| {
     crop: {processors: [:cropper], 
            crop_w:a.instance.crop_w,
            crop_x:a.instance.crop_x,
            crop_y:a.instance.crop_y,
            crop_h:a.instance.crop_h}
    }
    }
仅当您将a.instance.crop_w设置为实例时,

crop_w才会存在。所以对我来说,在我的控制器中我有类似

的东西
@profile = Profile.find_by_id(params[:id])

#
@profile.picture1_from_url(params[:profile][:picture1_url],params[:profile][:crop_w ...)

picture1_from_url是我用url从paperclip下载图片的方式。这种方法在模型中是这样的:

def picture1_from_url(url,crop_w,crop_x,crop_h,crop_y)
    self.crop_w = crop_w
    #repeat above line with crop_h crop_y crop_x
    self.picture1 = URI.parse(url)
end

通过设置self.crop_w = crop_w我将该变量附加到实例,这就是styles lambda可以访问该实例的原因。

最后,通过像这样传递它,可以通过选项哈希在处理器中访问它。在我的处理器中:

def options
  @options
end

def transformation_command
  crop_command = ["-crop","#{options[:crop_w]}x#{options[:crop_h]}+#{options[:crop_x]}+#{options[:crop_y]}"]
  crop_command + super
end

这就是我如何让它发挥作用。