Поместите встроенный HTML в переменную

Есть ли способ поместить встроенный HTML в представление в переменную? Что-то вроде этого:

<% t = content_to_var do %>
   <h1>The title</h1>
<% end %>

<% my_var = content_to_var do %>
   <p>Watch this fine results:</p>
   <table>
   <tr><td>Value 1.1</td><td>Value 1.2</td></tr>
   <tr><td>Value 2.1</td><td>Value 2.2</td></tr>
   <tr><td>Value 3.1</td><td>Value 3.2</td></tr>
   </table>
<% end %>

<%= render 'partial', { title: t, contents: my_var }

Имейте в виду, что я знаю об отсутствии функции с именем именно "content_to_var". Он упоминается только для примера.

Я знаю о content_for и yield, но хочу сделать то же самое через локалов.

мне не нравится идея делать

my_var = '<table><tr><td>Value 1.1</td><td>Value 1.2</td></tr></table>'.html_safe

Это выглядит некрасиво.


person Paul    schedule 21.11.2012    source источник
comment
Почему вы хотите передать эти переменные партиалу? Идея представлений (и партиалов) заключается в том, что они содержат в основном статический HTML (или XML или что-то еще), и вы добавляете встроенные переменные.   -  person Flauwekeul    schedule 21.11.2012


Ответы (2)


В старых версиях Rails вы можете сделать

<% t = capture do %>
  <h1>The title</h1>
<% end %>

Не знаю о более новых версиях

person 244an    schedule 21.11.2012
comment
На мой взгляд, это не так чисто. Не знаю всей ситуации для вас. Но я бы вместо этого переместил захват в частичный (и не использовал там захват) и использовал переменные locals/instance для его решения. Или, возможно, создали вспомогательные методы вместо частичного и использовали их в основном цикле вашего rhtml. - person 244an; 21.11.2012
comment
Мне удалось выполнить задачу без каких-либо частей. Определили массив, где каждая строка формировалась путем захвата, затем использовали каждую. Спасибо всем, кто откликнулся - это помогло мне выбрать оптимальное решение. - person Paul; 21.11.2012

Почему бы просто не рендерить партиалы? Вот для чего они сделаны.

Вы можете сделать что-то вроде:

<% t = render :partial => 'title', :title => 'The title' %>
<% my_var = render :partial => 'values', :values => @values %>

<% render :partial => {title: t, contents: my_var } %>

И для полноты ваш _title.html.erb будет выглядеть так

<h1><%= title %></h1>

Надеюсь это поможет.

person nathanvda    schedule 21.11.2012
comment
Мне нужно отобразить одно и то же частичное в цикле, принимая значения из массива. - person Paul; 21.11.2012
comment
Я не понимаю, что вы хотите сказать этим комментарием. Хотите увидеть пример, в котором партиал рендерится в цикле? - person nathanvda; 21.11.2012