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

时间:2009-10-17 14:44:28

标签: ruby-on-rails ruby coding-style nested

我有一个辅助方法,可以为某些控制器创建导航链接。

  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

我不喜欢这种深层嵌套的结构,以及额外的<<和其中一行的结尾。

如何重写它以使它不像那样嵌套(用更少的行)和没有长行(&lt; 80 chars)?

3 个答案:

答案 0 :(得分:7)

使用partial - 将所有内容放入返回的闭包中,然后使用render :partial => ...

答案 1 :(得分:3)

考虑使用markaby之类的内容而不是content_tag;它使你的助手更具可读性。另见railscast

答案 2 :(得分:2)

从内到外构建它:

  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 %>
...