Если другие выражения в .html.erb в представлениях
В рельсах я часто сталкиваюсь с ситуацией, когда внутри представлений я сделаю что-то вроде
<% if @some_condition_previusly_established_in_a_controller %>
<div class="one">123</div>
<% else %>
<div class="two">something else</div>
<% end %>
Он выглядит немного беспорядочным. Является ли это приемлемым способом работы с представлениями или нет?
Ответы
Ответ 1
Если вы не можете придумать способ переписать это как вспомогательный метод, вы в основном застряли в нем, выглядя как уродливый. Это как раз то, как ERB, поскольку он должен был быть минимальным способом введения Ruby в другой шаблон обычного текста, а не как что-то обязательно обтекаемое или элегантное.
Хорошая новость - это редактор подсветки синтаксиса, как правило, делает ваши блоки <% ... %>
визуально отличными от вашего HTML, что может значительно улучшить читаемость.
Также почему были созданы другие представления, такие как HAML, где этот синтаксис намного загроможден:
- if some_condition_previusly_established_in_a_controller
.one 123
- else
.two something else
Ответ 2
Для одной или двух таких условных логик в ваших представлениях, я думаю, это прекрасно, но когда ваш код становится больше, и у вас есть несколько if..else..end
и выглядит "cluttery", я думаю, вам стоит взглянуть на реализацию "шаблона презентатора", который значительно очищает ваши взгляды, отделяя вашу логику до докладчиков.
Вот отличный учебник, который я последовал за Райаном Бейтсом в его серии Rails Casts на "Шаблоны презентатора с нуля". http://railscasts.com/episodes/287-presenters-from-scratch.
Ответ 3
Вы пробовали?
<% @some_condition_previusly_established_in_a_controller ? <div class="one">123</div> : <div class="two">something else</div> %>
Ответ 4
Если ваше представление содержит множество тегов и 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
Ответ 5
Да, это стандарт (и да, это выглядит беспорядок).
Если вы ищете возможную более чистую альтернативу, проверьте: Условная упаковка тегов в Rails/ERB
Ответ 6
Вы всегда можете переместить логику в контроллер и оставить вид чистым (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 %>