【问题标题】:How Do I Pass A Block Through To A Method Call?如何将块传递给方法调用?
【发布时间】:2013-10-22 13:28:52
【问题描述】:

我需要一个帮助器来生成包含在 <li> 中的链接,包括一个活动类。

如果没有支持块,这很容易:

  def nav_item(*args, &block)
    url = args[1]
    clazz = 'active' if current_page?(url)

    content_tag(:li, :class => clazz) do
      link_to(*args)
    end
  end

但是像link_to 我希望我的助手支持定义内容的块。使用 link_to 我可以做到:

那么我如何在我的助手中支持相同的功能?

我需要做的就是将块传递给link_to。我目前的尝试

  def nav_item(*args, &block)
    url = if block_given?
      args.first
    else
      args[1]
    end
    clazz = 'active' if current_page?(url)
    content_tag(:li, :class => clazz) do
      if block_given?
        # What goes here?
      else
        link_to(*args)
      end
    end
  end

【问题讨论】:

  • 所以你的问题是当你将块作为变量时如何将块传递给函数,比如你的例子中的block

标签: ruby-on-rails ruby block helper link-to


【解决方案1】:

您可以将块作为最后一个参数传递给link_to。像这样:

def nav_item(*args, &block)
  url = if block_given?
    args.first
  else
    args[1]
  end
  clazz = 'active' if current_page?(url)
  content_tag(:li, :class => clazz) do
    if block
      link_to(*args, &block)
    else
      link_to(*args)
    end
  end
end                         

【讨论】:

  • 我试过了,但没用,原来这是因为其他地方的错误。谢谢。