Направляет другой вывод, если блок задан внутри или через несколько строк - PullRequest
0 голосов
/ 28 апреля 2020

У меня проблемы с выяснением, что я сделал неправильно или как добиться того же результата. Я пытаюсь напечатать массив @attributes в виде рельсов.

Это не работает:

<% @attributes.each do |element| %>
<%= puts element.to_s %>
<% end %>

Но это:

<%= @attributes.each { |element| puts element.to_s }%>

Я также поиграл с тем, чтобы поместить все в первое утверждение в <% =%> без какого-либо успеха. Разве эти два утверждения не совпадают?

Кроме того, если бы вы могли мне помочь - как бы вы перебрали массив и вставили новую строку после каждого элемента?

Заранее спасибо! Alex

Ответы [ 2 ]

3 голосов
/ 28 апреля 2020

puts фактически не выводится в буфер ERB. Он выводит на STDOUT и возвращает ноль. Если вы хотите перебрать записи и вывести их, вы должны сделать это следующим образом:

<% @attributes.each do |element| %>
  <%= element.to_s %>
<% end %>

Теги <%= %> ERB выводят возвращаемое значение выражения в буфер. Если вы хотите сделать это с непечатным выражением ERB, вам нужно использовать concat:

<% @attributes.each { |element| concat element.to_s } %>

Разве эти два утверждения не совпадают?

Нет. Вывод фактически такой же как:

<% @attributes.each do |element| %>
  <%= nil %>
<% end %>

И

<%= @attributes %>
1 голос
/ 28 апреля 2020

Rails использует шаблоны ERB для визуализации представлений или, скажем, генерации html документов для браузеров и др.

ERB копирует текстовые части шаблона непосредственно в сгенерированный документ, и обрабатывает только тот код, который идентифицирован маркерами. Существует в основном два типа маркеров <% %> и <%= %>.

Тег со знаком равенства указывает, что заключенный код является выражением и что средство визуализации должно заменить элемент кода результатом кода (в виде строки) при отображении шаблона.

Теги без знака равенства означают, что прилагаемый код является скриптлетом. Каждый скриптлет перехватывается и исполняется, а конечный результат кода затем вводится в вывод в точке скриптлета.

<% @attributes.each do |element| %>
  <%= puts element.to_s %>
<% end %>

В приведенном выше примере вы говорите, что средство визуализации должно поместить все, что результат выражения во второй строке, который является выходом элемента.

В то время как здесь <%= @attributes.each { |element| puts element.to_s }%> вы просите рендеринг поставить объект / переменную @attributes вместе с отдельным выводом того, что есть внутри переменной @attributes, которая объясняет разницу в ваших выходных результатах.

PS вы можете избегать puts и to_s из <%= puts element.to_s %>, потому что все, что находится внутри <%= %>, попадает в HTML документ в виде самой строки.

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