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 に答える