2013-07-22 3 views
32

В рельсах, я часто сталкиваюсь с ситуацией, когда внутри взглядов я сделаю что-то вродеЕсли другое заявление в .html.erb в представлениях

<% if @some_condition_previusly_established_in_a_controller %> 
<div class="one">123</div> 
<% else %> 
<div class="two">something else</div> 
<% end %> 

Это выглядит немного cluttery. Является ли это приемлемым способом работы с представлениями или нет?

+9

Вы можете использовать <% -%>, чтобы избежать пустых строк, добавляемых к полученному HTML кода. –

ответ

19

Если вы не можете придумать способ, чтобы переписать это как вспомогательный метод, вы в основном застряли с ним ищет вид некрасиво. Это как раз то, как ERB, поскольку он был предназначен для минимального способа ввода Ruby в обычный шаблон с открытым текстом, а не как что-то обязательно обтекаемое или изящное.

Хорошая новость - это редактор подсветки синтаксиса, как правило, делает ваши блоки с блоками ERB визуально отличными от вашего HTML, что может значительно улучшить читаемость.

Это также объясняет, почему другие представления, как HAML были созданы, где этот синтаксис намного меньше суматохи:

- if some_condition_previusly_established_in_a_controller 
    .one 123 
- else 
    .two something else 
+2

Вот почему я предпочитаю HAML над ERB. HAML избавляется от беспорядка. –

+0

У меня проблема с HAML (я использую slim). Синтаксис HAML ясен и краток, когда ваш код html короток. но он станет беспорядочным, если код большой. Вы также не можете форматировать код при использовании некоторых IDE или плагинов .... – hqt

+0

@hqt HAML довольно хорош, пока ваши встроенные биты кода не станут слишком большими, это правда, но вы обычно можете уменьшить это, написав вспомогательные функции, которые минимизируют количество кода у вас есть в вашем шаблоне. Как вы указываете, существуют другие системы записи мета-HTML, подобные HAML, поэтому, если вы недовольны ERB, у вас есть варианты. – tadman

9

Для одного или два таких условной логики в ваших взглядах, я думаю, его хорошо, но когда ваш код получает больше, и у вас есть несколько if..else..end и выглядит «cluttery», я думаю, вам стоит взглянуть на реализацию «Presenter Pattern», который сильно очищает ваши взгляды, отделяя вашу логику с презентаторами.

Вот отличный учебник, который я последовал за Райаном Бейтсом в его серии Rails Casts на «Presenter Patterns from scratch». http://railscasts.com/episodes/287-presenters-from-scratch.

+0

Хорошая ссылка, но не доступна для просмотра всем пользователям без платной учетной записи. = ( –

+0

Да, меня просто беспокоит, что если я буду нарушать законы об авторском праве, если я разместил ссылку на источник github, я попытаюсь опубликовать ссылку на источник и отредактировать свой ответ, чтобы включить необходимые классы и файлы для просмотра на, если он не преследует меня :) – vee

+0

Похоже, [эпизод 287] (https://github.com/ryanb/railscasts-episodes/tree/master/episode-287) является общедоступным, по крайней мере, в одном из его репозиториев , –

3

Вы пробовали?

<% @some_condition_previusly_established_in_a_controller ? <div class="one">123</div> : <div class="two">something else</div> %> 
-2

Вы всегда можете переместить логику в контроллер и оставить вид чистым (er).

Контроллер:

if @some_condition 
    @div_class = :one 
    @div_content = 123 
else 
    @div_class = :two 
    @div_content = 'something else' 
end 

Вид:

<div class="<%= @div_class %>"><%= @div_content %></div> 

Или с помощью помощника:

<%= content_tag :div, @div_content, class: @div_class %> 
3

Если представление содержит много тегов и HTML-элементов, вы можете поместить их в частичные и логические параметры в модели

Вид:

<%= render :partial => @model.status %> 

<%= render :partial => "file/path/#{@model.status}" %> # if your partial is in some different folder 

Если ваш статус один, то это сделало бы файл _one.html.erb

Если два, то это будет оказывать файл _two.html.erb автоматически.

Модель:

def status 
    if @some_condition 
     "one" 
    else 
     "two" 
    end 
end