我有一个辅助方法,可以为某些控制器创建导航链接。
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)?
答案 0 :(得分:7)
使用partial - 将所有内容放入返回的闭包中,然后使用render :partial => ...
答案 1 :(得分:3)
答案 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 %>
...