我看了很多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
答案 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
这就是我如何让它发挥作用。