如何将变量传递给像@ photo_main.file.url(:img_120x120)这样的方法调用?

时间:2013-01-22 12:40:28

标签: ruby-on-rails-3 variables methods carrierwave

使用Carrierwave上传图片, 我想写一个函数来处理我的所有图像包括几种尺寸。

  image_tag @photo_main.file.url(:img_122x145) rescue nil

:img_120x120是在Carrierwave上传器中定义的,但为什么:img_120x120分号在其名称之前?这是什么格式?

通缉结果:

def get_avatar(size)

   image_tag @photo_main.file.url(size) rescue nil

end

怎么可以这样做?

更新1:

失败:ActionView :: Template :: Error(未定义的方法`file'代表nil:NilClass):     1:.ruler     2:     3:// = show_avatar_profile(@ profile.id)     4:= show_avatar_new(@ profile.id,“96x96”)

  def show_avatar_new(id, size)

    puts "size is"
    size =  size.to_sym
    puts size

    @photo_main = Photo.where(:attachable_id => id, :attachable_type => "Profile", :main => true, :moderated => true, :approved => true).first
    @photo = Photo.where(:attachable_id => id, :attachable_type => "Profile", :moderated => true, :approved => true).first

    if @photo_main
      image_tag @photo_main.file.url(size)
    else
      image_tag @photo.file.url(size)
    end

  end

更新2:

class PhotoUploader < CarrierWave::Uploader::Base

  include CarrierWave::RMagick
  CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end


  version :img_48x48 do
    process :resize_to_fill => [48, 48]
  end

  version :img_58x58 do
    process :resize_to_fill => [58, 58]
  end

  version :img_75x75 do
    process :resize_to_fill => [75, 75]
  end

  version :img_96x96 do
    process :resize_to_fill => [96, 96]
  end

  # Used in search results,
  version :img_122x145 do
    process :resize_to_fill => [122, 145]
  end

  version :img_200x200 do
    process :resize_to_fill => [200, 200]
  end


  protected

  def secure_token(length=32)
    var = :"@#{mounted_as}_secure_token"
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2))
  end

  def delete_empty_upstream_dirs
    path = ::File.expand_path(store_dir, root)
    Dir.delete(path) # fails if path not empty dir

    path = ::File.expand_path(base_store_dir, root)
    Dir.delete(path) # fails if path not empty dir
  rescue SystemCallError
    true # nothing, the dir is not empty
  end

end

1 个答案:

答案 0 :(得分:2)

在Ruby中,以冒号:开头的东西(不是分号;!)是符号,它们本质上是不可变的字符串。

"img_122x145".to_sym # => :img_122x145

看起来你所写的就是你所需要的。如果你想知道把它放在哪里,你可以把它放在帮手

# app/helpers/avatar_helper.rb
def get_avatar(size)
  image_tag @photo_main.file.url(size)
end

但请不要在那里使用rescue nil。你想要抓到什么错误?明确地避免它而不是使用异常作为流控制会好得多。

image_tag @photo_main.file.url(size) if @photo_main.file?

足以避免@photo_main没有file的问题,并且更有意图揭示(事实上,更高效)。最糟糕的情况是,您仍应明确说明您期望获得的错误

def get_avatar(size)
  image_tag @photo_main.file.url(size)
rescue SomeSpecificErrorThatCantBeAvoided
  nil
end

This short (<3min) screencast是避免内联救援的绝佳理由。


<强>更新

在CarrierWave中创建版本时,它会创建访问它们的方法 - 您不会将参数传递给url

@photo.file.img_122x145.url

如果你想获得一个变量版本,可以通过versions(哈希)获得它们:

size = :img_122x145
@photo.file.versions[size].url

这不会解决您剩下的问题,这只是您的查询没有找到任何内容。