通过抽象/移动ruby代码来清理erb文件

时间:2011-01-21 12:07:58

标签: ruby-on-rails ruby

我想知道是否可以清理或重新组织我的视图,以便减少Ruby代码。 HTML经常变得很麻烦,因为它有很多Ruby代码。

我考虑将所有Ruby内容移动到帮助程序中,并将每个函数(链接,标记等)分配给方法。

实施例。布局更复杂,问题变得更糟。

<div class="sidebar">
  <div id="art_nav">
    <%= link_to "Previous", art_path(@previous), :remote => true, :class => "prev" unless @previous.nil? %> 
    <%= link_to "Next", art_path(@next), :remote => true, :class => "next" unless @next.nil? %>
  </div>
</div>

会变成:

<div class="sidebar">
  <div id="art_nav">
    <%= link_to_previous %>    
    <%= link_to_next %>
  </div>
</div>

助手:

def link_to_previous
  link_to "Previous", art_path(@previous), :remote => true, :class => "prev" unless @previous.nil?
end

def link_to_next
  link_to "Next", art_path(@next), :remote => true, :class => "next" unless @next.nil?
end

这似乎适用于简单的例子..但我想知道当我必须做循环或类似时我应该如何组织。

更新:已添加循环示例

<% arts.each do |art| %>
        <h3><%= art_title %></h3>
        <p><%= art_description %></p>
        <div id="comments_<%= art.id %>">
            <%= render :partial => "/comments/index", :locals => {:resource => art} %>
        </div>
    </div>
<% end %>

你会做什么?

1 个答案:

答案 0 :(得分:0)

以下是您可以在代码中使用的模式,以便进一步清理它:

def menu(*options, &block)
    params = options[0]
    active = (params[:active] if params) || false
    first = (params[:first] if params) || false
    "
    <div class=\"menu\">
        <div class=\"menu-left #{active ? "active" : "inactive"} #{first ? "first" : "not-first"}\">
        </div>
        <div class=\"menu-center\">
            <div class=\"menu-content #{active ? "active" : "inactive"}\">
              #{capture(&block)}
        </div>
        </div>
        <div class=\"menu-right #{active ? "active" : "inactive"}\">
        </div>
    </div>
    ".html_safe
  end

使用这个助手,代码变得非常简单:

<%= menu(:active => @active_menu == :menu1 ? true : false, :first => true) do %>
    <%= link_to "Les produits et les prix", menu1_path %>
<% end %>

在这种模式的中心,有一个电话

#{capture(&block)}

很抱歉这个例子根本不是“通用的”,我从我自己的代码中复制并粘贴了。但我相信你明白了。