Ruby:在块内调用方法时,将默认参数传递给方法

时间:2014-07-05 23:23:46

标签: ruby-on-rails ruby block view-helpers

我尝试创建一个非常简单的Rails助手来生成一个fancybox图像预览。它应该产生以下HTML:

<a href="path-to-image" class="fancybox">
  <img src="path-to-image-thumb" ... />
</a>

但是,要输出包含许多图像的可点击图库,我需要将rel属性设置为所有链接的相同值:

<a href="path-to-image" class="fancybox" rel="my-gallery">
  <img src="path-to-image-thumb" ... />
</a>
<a href="path-to-image2" class="fancybox" rel="my-gallery">
  <img src="path-to-image2-thumb" ... />
</a>

我喜欢这样做:

# Single image
<%= image_preview(image) %>

# Image gallery
<%= image_gallery('my-gallery') do |g| %>
  <%= g.image_preview(image) %>
  <%= g.image_preview(image2) %>
<% end %>

所以我想在一个块中使用相同的image_preview方法,而不是一个,但我正在努力实现。

我目前的实施(不起作用)如下所示:

def image_preview(image, options = {})
  link_to image.url, class: 'fancybox' do # How do I decide whether I have to put the rel attribute?
    image_tag image.url(:thumb), options
  end
end

def image_gallery(name, &block)
  yield self # Somehow I have to use the provided name as rel attribute in image_preview...
end

我也试过with_options,但我并没有真正为它工作(并且真的不知道如何在这种情况下使用它)。

1 个答案:

答案 0 :(得分:0)

我的实现如下:

module ImageGalleryHelper
  def image_gallery(name = nil, &block)
    name ||= 'gallery_' + SecureRandom.hex(6)

    content_tag :div, class: name do
      with_options gallery_name: name do |gallery|
        yield gallery
      end
    end
  end

  def fancy_image(image, options = {})
    content_tag :a, href: image.url, class: 'fancybox', rel: options.delete(:gallery_name) do
      image_tag image.url(:thumb), options
    end
  end
end

这正是我想要的。也许有一些增强可能吗?