Подтвердить что ты не робот

Если другие выражения в .html.erb в представлениях

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

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

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

4b9b3361

Ответ 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

Ответ 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 %>