我将能力传递给Carrierwave上传的图像进行裁剪。这里是我正在关注的Youtube上的RailsCast视频。
我心想这是什么鬼。我没有在任何地方调用这个方法。但如果未定义它,我们就来定义它!结果成功了!但后来我查看了更多关于这个方法的信息,并发现它是内置在Active Record Autosave Association模块中的。从文档中得知,这个方法的作用如下:
但在Uploader中包含RMagick后,我收到了以下信息:
undefined method `marked_for_destruction?' for #<ImageUploader:0x007fe86634fcf0>
我心想这是什么鬼。我没有在任何地方调用这个方法。但如果未定义它,我们就来定义它!结果成功了!但后来我查看了更多关于这个方法的信息,并发现它是内置在Active Record Autosave Association模块中的。从文档中得知,这个方法的作用如下:
返回是否将此记录作为父级保存事务的一部分进行删除。
只有当父对象的 :autosave 选项对此关联模型启用时才有用。
但是我没有向任何对象传递 autosave: true
!
那么,我的第一个问题 - 它是否默认完成了?
2 - 在 RailsCast 教程中,他并没有定义这个方法。为什么我要这样做?
3 - 下面是我的代码,请问有错误吗?
4 - 如果可能,能有人解释一下这个过程的工作原理吗?
非常感谢!
product.rb:
has_one :image
validates :image, presence: true
mount_uploader :image, ImageUploader
products_controller.rb:
def create
@product = Product.new(product_params)
@product.category_id = params[:category_id]
@product.user_id = current_user.id
respond_to do |format|
if @product.save
if params[:product][:image].present?
format.html { render :crop }
else
format.html { redirect_to @product, notice: 'Product was successfully created.' }
format.json { render :show, status: :created, location: @product }
end
else
format.html { render :new }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
image_uploader.rb:
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
def marked_for_destruction?
@marked_for_destruction
end
def mark_for_destruction
@marked_for_destruction = true
end
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
version :large do
resize_to_limit(600,600)
end
end
belongs_to
需要设置为true,并且它与我的问题有什么关系。我相信人们会感激的。我已经不在那个项目上工作了,所以不能轻易测试这个。 - Julius Dzidzevičiusapplication.rb
中做了这个,而且它起作用了。 - marimaf