在CarrierWave Image Uploader方法中访问params属性

时间:2015-03-13 02:02:29

标签: ruby-on-rails ruby-on-rails-4 carrierwave

我想访问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>>

如何访问该行代码?

谢谢, 杰夫

2 个答案:

答案 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访问该值。