我想访问CarrierWave Uploader方法中params散列中的:default_mat属性,以便我可以使用特定的彩色垫进行图像处理。
class ProductImageUploader < CarrierWave::Uploader::Base
#....
def frame_image
manipulate! do |img|
matID = params[:photo][:default_mat]
if img.width / img.height < 2
bg_image = MiniMagick::Image.open("http://s3-us-west-2.amazonaws.com/luminoto-modal/#{matID}.jpg")
end
在调试器中,我可以看到以下值:default_mat是3,如下所示
{"utf8"=>"✓", autthenticity_token"=>"yZHusEs7hTwAQWfN2OMGRpzF8qCqJwW74QEeY7EEzR0=", "photo"=>{"default_mat"=>"3"}, "commit"=>"Add Photo", "action"=>"create", "controller"=>"photos"}
但以下代码行返回
>> params[:photo][:default_mat]
#<NameError: undefined local variable or method `params' for #<ProductImageUploader::Uploader70281603335700:0x007fd76a573a98>>
如何访问该行代码?
谢谢, 杰夫
答案 0 :(得分:3)
params
哈希仅在控制器操作中可用。它不适用于型号,Carrierwave Uploaders或任何其他地方。这是您尝试在ProductImageUploader
类中访问它时出现以下错误的原因:
#<NameError: undefined local variable or method 'params' for #<ProductImageUploader::Uploader70281603335700:0x007fd76a573a98>>
params[:photo][:default_mat]
将在Controller#action
中提供,它通过HTTP GET
(作为查询字符串)或POST
(如通过表单发布参数)请求接收参数。
要在params[:photo][:default_mat]
中访问ProductImageUploader
的值,您可以将其值存储为模型实例中的虚拟属性,该模型将会ProductImageUploader
class作为CarrierWave Uploader。在此之后,使用frame_image
访问model.attribute_name
方法中的存储值,其中attribute_name
是您创建的虚拟属性。
例如:
## Model
class ModelName {
# ...
attr_accessor :attribute_name
# ...
}
## In ProductImageUploader
matID = model.attribute_name
答案 1 :(得分:0)
我与某人合作,他提出了以下解决方案。
他注意到,一旦创建了一个新实例,在图像属性之前的参数哈希中的所有属性都将被赋予值,但之后的所有属性都将为零。
要解决此问题,我们创建了一个没有image属性的新对象实例,然后更新了image属性,它可以处理文件并调整文件大小。
def create
@photo = Photo.new(photo_params.except("image"))
#as soon as you call image equals, the processing starts and all values in the hash after are known
@photo.image = photo_params.delete("image")
if @photo.save
# @photo.delay.update(image: params[:photo][:image]) #process image in background
flash[:notice] = "Your new photograph is being processed."
redirect_to @photo
else
flash[:notice] = "Please check that all the fields were entered"
render 'new'
end
端
然后我可以通过载波上传器文件中的model.default_mat访问该值。