代码之家  ›  专栏  ›  技术社区  ›  JRL

如何使这个Ruby方法不那么难看(嵌套)

  •  1
  • JRL  · 技术社区  · 15 年前

    我有一个助手方法为一些控制器创建导航链接。

      def gen_associations(controllers)
        content_for :leftnav do
          sorted_controllers = controllers.sort
          returning String.new do |content|
            content << content_tag(:h3, "Associations") <<
            content_tag(:ul, :class => "nav") do
              sorted_controllers.collect do |c|
                content_tag("li", :class => ("last" if c == sorted_controllers.last)) do
                  link_to(c.humanize, eval("admin_#{c}_url"))
                end
              end
            end
          end
        end
      end
    

    我不喜欢这种深嵌套结构,还有 << 其中一行的结尾。

    如何重写它,使其不像那样嵌套(在较少的行中)并且没有长行(<80个字符)?

    3 回复  |  直到 13 年前
        1
  •  2
  •   Jerry Fernholz    15 年前

    从内到外构建:

      def gen_associations(controllers)
        sorted_controllers = controllers.sort
    
        list_items = 
          sorted_controllers.collect do |c|
            content_tag("li", :class => ("last" if c == sorted_controllers.last)) do
              link_to(c.humanize, eval("admin_#{c}_url"))
            end
          end
    
        list = content_tag(:ul, list_items.join, :class => "nav")
    
        content_for :leftnav do
          content_tag(:h3, "Associations") << list
        end
      end
    

    我可能会把 content_for 对视图或局部 gen_associations() 返回 list .

    ...
    <% content_for :leftnav do %>
      <h3>Associations</h3>
      <%= gen_associations(@controllers) %>
    <% end %>
    ...
    
        2
  •  7
  •   tig Charlie Martin    15 年前

    使用部分-把所有东西都放回关闭处,然后使用 render :partial => ...

        3
  •  3
  •   giorgian    15 年前

    考虑使用类似 markaby 而不是内容标签;它使您的助手更具可读性。也见此 railscast .