Хранение выражения ERB в строке Ruby

#ruby-on-rails #ruby #erb

Вопрос:

Я создаю веб-страницу в файле html.erb. Он включает в себя 20 карточек с одинаковыми элементами, каждая из которых включает ссылку. Я хотел бы создать карту один раз, повторяя хэш Ruby, чтобы создать остальные.

Однако некоторые абзацы карточки содержат выражение ERB, и я не смог найти способ включить его в хэш. Есть ли обходной путь для хранения этой информации в хэше?

Вот пример того, как я пытаюсь сохранить информацию, при этом проблема заключается в значении «абзац» :

 {
  "product1" => {
    "title" => "The Best Product for Your Needs",
    "paragraph" => "Find out more <%= link_to 'here', 'https://www.product.com' %> about what this product can do for you."
  }
}  
 

Я пробовал экранирование регулярных выражений , различные комбинации кавычек ( ' vs " ) и интерполяцию строк Ruby ( #{<%= ... %>} ).

Спасибо!

Комментарии:

1. Должно быть, я что-то упускаю. Я не понимаю, в чем проблема. Не могли бы вы быть более конкретными? Мне кажется, что это должно работать именно так, как вы написали.

2. Если вы хотите оценить, что ERB expr внутри абзаца, вам может потребоваться отрисовка перед печатью внутри компонента , а затем печать в компоненте с помощью <%= raw ERB.new(item["paragraph"]).result(binding) %>

3. @MichaelB, это выдает ошибку ERB в строке и на странице 404.

Ответ №1:

Итак, что вы хотите сделать, это отобразить текст «абзаца» в виде кода ERB.

В то время как вы можете сделать это с помощью чего-то вроде…

 <%= raw ERB.new(@hash[:product1][:paragraph]).render(binding) %>
 

Это странная вещь, и я бы не рекомендовал смешивать логику представления с данными, передаваемыми в ваше представление.

Более распространенный подход заключается в передаче информации, которую необходимо отобразить в представлении, и все. Например, введите URL-адрес, который вы хотите связать, и отобразите его следующим образом:

 # in a controller...
@product_hashes = {
  "product1" => {
     "title" => "The Best Product for Your Needs",
     "url" => "https://www.product.com"
  }
}  
# in the view
<% product_hashes.each do |product_key, product_hash| %>
  <div class='title'><%= product_hash['title'] ></div>
  <div class='description'> Find out more <%= link_to 'here', product['url'] %> about what this product can do for you.</div>
<% end %>
 

Я бы также задался вопросом, почему мы вообще пропускаем хэш. Более распространенным является использование объектов из вашей базы данных непосредственно в представлении. Что-то вроде…

 <% @products.each do |product| %>
  <div class='title'><%= product.title ></div>
  <div class='description'> Find out more <%= link_to 'here', product.url %> about what this product can do for you.</div>
<% end %>
 

Комментарии:

1. Спасибо, что ответили! Объекты не хранятся в базе данных, поэтому я выбираю первый вариант. Проблема в том, что мне нужно сохранить URL-адрес в предложении, и это предложение и ссылка будут разными на каждой карточке. Я попробовал ваши предложения, но не смог заставить их работать с URL-адресом, встроенным в предложение.

2. Можете ли вы опубликовать сообщение об ошибке? Но да, вообще говоря, я бы, вероятно, рекомендовал использовать другой подход. Даже просто используя необработанный HTML вместо интерполяции ERB или создавая файл шаблона для каждого продукта и передавая вместо этого массив частичных представлений для визуализации.

3.На самом деле — другой вариант состоит в том, чтобы текстовые поля были написаны синтаксисом markdown и использовали драгоценный камень для анализа в html (чтобы превратить ссылки в ссылки). github.com/gettalong/kramdown Kramdown::Document.new(text).to_html