Undistraction
Undistraction

Reputation: 43401

How Do I Pass A Block Through To A Method Call?

I need a helper that generates a link wrapped in a <li> including an active class.

Without supporting blocks this is easy:

  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

But like link_to I want my helper to support blocks for defining content. With link_to I can do:

So how do I support the same in my helper?

All I need to do is pass the block through to link_to. My current attempt

  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

Upvotes: 1

Views: 256

Answers (1)

bundacia
bundacia

Reputation: 1036

You can just pass the block to link_to as the last arg. Like this:

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                         

Upvotes: 5

Related Questions