Rails Image Helper的可选参数

时间:2010-09-14 20:07:28

标签: ruby-on-rails ruby helpers

在我目前的Rails(Rails 2.3.5,Ruby 1.8.7)应用程序中,如果我希望能够定义一个帮助器,如:

  def product_image_tag(product, size=nil)
    html = '' 
    pi = product.product_images.first.filename
    pi = "products/#{pi}"
    pa = product.product_images.first.alt_text

    if pi.nil? || pi.empty?
      html = image_tag("http://placehold.it/200x200", :size => "200x200")
    else
      html = image_tag(pi, size)
    end

    html

  end

...然后使用以下任一方式从视图中调用它:

<%= product_image_tag(p) %>

...或:

<%= product_image_tag(p, :size => 20x20) %>

换句话说,我希望能够让这个辅助方法采用可选的大小参数。什么是最好的方法呢?

1 个答案:

答案 0 :(得分:10)

你走在正确的轨道上。我会这样做:

def product_image_tag(product, options = {})
  options[:size] ||= "200x200"

  if img = product.product_images.first
    image_tag("products/#{img.filename}", :alt => img.alt_text, :size => options[:size])
  else
    image_tag("http://placehold.it/#{options[:size]}", :size => options[:size])
  end
end

说明:

将最终参数设置为空哈希是一种常见的Ruby习惯用法,因为您可以调用product_image_tag(product, :a => '1', :b => '2', :c => '3', ...)之类的方法,而无需显式地将剩余的参数作为{}的哈希值。

options[:size] ||= "200x200"将:size参数设置为200x200,如果没有传递给方法。

if img = product.product_images.first - Ruby允许你在一个条件内做任务,这太棒了。在这种情况下,如果product.product_images.first返回nil(无图像),则返回到placehold.it链接,否则显示第一张图像。