我正在尝试使用carrierwave获取图像的尺寸,但我希望使用我创建的自己的代码获取尺寸,尝试运行fastimage after_save
或after commit
。我收到这个错误:
wrong number of arguments (1 for 0)
Extracted source (around line #45):
# [String] contents of the file
#
def read
file.read if file.respond_to?(:read)
end
carrierwave (0.11.2) lib/carrierwave/uploader/proxy.rb:45:in `read'
fastimage (2.1.0) lib/fastimage.rb:343:in `block in fetch_using_read'
模型看起来像这样
class Micropost < ApplicationRecord
after_save :change_picture_dimensions
mount_uploader :picture, PictureUploader
def change_picture_dimensions
if :picture?
widthheight = FastImage.size(picture)
if widthheight[0] >= 501
newheightratio = widthheight[1].to_f / widthheight[0].to_f
newheight = newheightratio * 500
self.picture = "<img src=\"" + picture.to_s + "\" width=\"500\" height=\"" + newheight.to_s + "\">"
else
self.picture = "<img src=\"" + picture.to_s + "\" width=\"" + widthheight[0].to_s + "\" height=\"" + widthheight[1].to_s + "\">"
end
end
end
这只是我系统上的本地文件。我可以使用minimagick here来获取尺寸,但想了解更多关于载波的过程以及为什么我不能使用我的方法来获得此错误的尺寸原因?在我的方法中,我只是使用比率来保持纵横比,但是适合我对任何图像的div的固定宽度。
编辑:我意识到我需要在保存对象之前执行此操作,但即使使用before_create,我也会遇到相同的错误。
答案 0 :(得分:1)
您无法为图片分配字符串。它必须是URL,文件或IO对象。
如果您想要预处理图像宽度以适合500px,请声明以下内容:
<foreignObject width="150" height="150" class="red-y-axis-labels-522">
<svg>
<text x="63" y="133" text-anchor="end" stroke="none" fill="#000000"
style="text-anchor: end; font-family: Verdana; font-size: 11px;" font-family="Verdana" font-size="11px"
transform="matrix(1,0,0,1,0,0)" height="2">
<tspan dy="4.390625" x="63" >0</tspan>
</text>
<text x="63" y="103.5" text-anchor="end" stroke="none" fill="#000000" style="text-anchor: end; font-family: Verdana; font-size: 11px;" font-family="Verdana" font-size="11px" transform="matrix(1,0,0,1,0,0)">
<tspan dy="4.390625" x="63">3.25M</tspan>
</text>
<text x="63" y="74" text-anchor="end" stroke="none" fill="#000000" style="text-anchor: end; font-family: Verdana; font-size: 11px;" font-family="Verdana" font-size="11px" transform="matrix(1,0,0,1,0,0)">
<tspan dy="4.390625" x="63">6.5M</tspan>
</text>
<text x="63" y="29.749999999999986" text-anchor="end" stroke="none" fill="#000000" style="text-anchor: end; font-family: Verdana; font-size: 11px;" font-family="Verdana" font-size="11px" transform="matrix(1,0,0,1,0,0)">
<tspan dy="4.390624999999986" x="63">11.375M</tspan>
</text>
</svg>
</foreignObject>
要从其他服务器保存图像,您可以执行以下操作:
# app/uploaders/picture_uploader.rb
class PictureUploader < CarrierWave::Uploader::Base
...
process resize_to_fit: [500, nil]
end
class Micropost < ApplicationRecord
mount_uploader :picture, PictureUploader
end
现在你可以在页面上呈现它了
micropost = Micropost.create(
picture: 'http://server.example.org/image.png'
)
您还可以在模型中存储图像大小。阅读this documentation如何执行此操作。将图像尺寸保存到图片模型后,您可以在= image_tag micropost.picture.url
中指定它们,但我认为这将是多余的,因为浏览器会自动检测图像尺寸
image_tag