Очистка файлов erb путем абстрагирования / перемещения кода ruby - PullRequest
0 голосов
/ 21 января 2011

Мне было интересно, можно ли будет очистить или реорганизовать мои представления так, чтобы у меня было меньше кода 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 голосов
/ 21 января 2011

Вот шаблон, который вы можете использовать в своем коде для дальнейшей очистки:

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)}

Извините, этот пример не является "общим" вообще, я сделал копирование и вставку из моего собственного кода. Но я уверен, что вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...