【发布时间】:2014-07-14 04:00:17
【问题描述】:
在我的 Rails 应用程序中,我允许用户使用 Carrierwave 和 Amazon S3 上传图像。我想实现一个功能,让用户通过旋转 90 度来编辑现有图像。
我对这段代码的去向感到困惑。它是在图像上传器文件中,还是在图像控制器中?它是怎么称呼的?我相信它应该看起来像这样:
image = Image.find(params[:id])
image_obj = MiniMagick::Image.read(image.file)
image_obj.rotate(-90)
image_obj.write(image.file)
但我无法找到可以帮助我的示例。如果有人能给我指点正确的方向,我将不胜感激!
编辑
感谢 deep 的彻底回复!这是我最终做的:
在我看来:
# image.html.erb:
<%= link_to rotate_image_path(:id => image.id), :remote => true %>
在我的控制器中:
# image_controller.rb:
def rotate
@image = Image.find(params[:id])
@image.rotated = true
@image.save
respond_to do |format|
format.js { render :nothing => true }
end
end
在我的模型中:
# image.rb
attr_accessible :rotated
after_save :rotate_image, if: ->(obj){obj.rotated.present? && obj.rotated?}
def rotate_image
self.image_path.recreate_versions!
end
在我的上传器中:
# image_uploader.rb
process :rotate_img
def rotate_img
if model.rotated.present? && model.rotated?
manipulate! do |img|
img.rotate '-90'
img
end
end
end
我所做的唯一真正的改变是在上传器中,我在尝试执行条件处理时遇到了错误。我将条件放在 rotate_img 方法中。
【问题讨论】:
标签: ruby-on-rails amazon-s3 carrierwave minimagick