如何使用方法的字符串参数作为方法名称变量

时间:2016-05-22 00:30:13

标签: ruby-on-rails ruby

在我的rails应用程序中,我使用了carrierwave来处理图像。 Carrierwave创建不同版本的图像,网址可以像这样获得:picture.large.urlpicture.small.urlpicture.thumb.url等。

我想创建一个可以接受字符串参数的方法,然后可以将其用于图像URL。像这样:

def profile_url (version)
  picture.version.url
end

那么我可以写@user.profile_url('thumb'),它应该给我拇指大小的网址。

我得到一个未定义的方法'版本'错误。这可能吗?

2 个答案:

答案 0 :(得分:6)

通常你可以这样做:

def profile_url(version)
  version = version.to_sym

  case version
  when :large, :small, :thumb
    picture.send(version).url
  end
end

此处to_sym来电的原因是您可以拨打此profile_url('thumb')profile_url(:thumb),这两种情况都可以。

答案 1 :(得分:1)

根据CarrierWave url的文档,您可以将版本作为参数传递:

  

当给出版本名称作为参数时,将返回该版本的URL [...]

my_uploader.url           #=> /path/to/my/uploader.gif
my_uploader.url(:thumb)   #=> /path/to/my/thumb_uploader.gif

您的代码可以写成:

class User < ActiveRecord::Base
  mount_uploader :picture, PictureUploader

  def profile_url(version)
    picture.url(version)
  end
end

并通过以下方式致电:

@user.profile_url('thumb')
# or
@user.profile_url(:thumb)

您也可以直接调用该方法:

@user.picture.url('thumb')
# or
@user.picture.url(:thumb)