0

以下代码应接受嵌套代码并在“li”标签中产生

def sidebar_link(text,link, color = nil)
  recognized = Rails.application.routes.recognize_path(link)
  output = ""
  content_tag(:li, :class => ( "sticker sticker-color-#{color}" if color) ) do
  if recognized[:controller] == params[:controller] && recognized[:action] == params[:action]
    output << link_to( text, link, :class => 'lead')
  else
    output << link_to( text, link) 
  end
  output << yield if block_given?
  raw output
 end
end

在 HAML 视图中:

      %ul
        = sidebar_link 'Tickets', tickets_path, :orange do
          %ul.sub-menu
            = sidebar_link "Service Requests #{ServiceRequest.all.count}", service_requests_path
        = sidebar_link 'Problems', problems_path, :green
        %li.divider
        = sidebar_link 'Clients', clients_path, :blueDark
        = sidebar_link  'Services', services_path, :red do
          %ul.sub-menu
            = sidebar_link 'Categories', categories_path

这会生成正确的 HTML,但第一个链接除外。输出不包含“Tickets”字样,但其他一切似乎都很好。

那么为什么会出现这种奇怪的行为呢?辅助递归混淆“输出”变量?

4

1 回答 1

2

我找到了明确使用 &block 的解决方案,如下所示

def sidebar_link(text,link, color = nil, &block)
 recognized = Rails.application.routes.recognize_path(link)
 output = ""
 content_tag(:li, :class => ( "sticker sticker-color-#{color}" if color) ) do
  output << link_to( text, link, :class => ( 'lead' if recognized[:controller] == params[:controller] && recognized[:action] == params[:action]) )
  output << capture(&block) if block_given?
  raw output
 end
end
于 2012-12-03T13:43:46.207 回答