#ruby #undefined #erb #local-variables
#ruby #неопределенная #ошибка #локальные переменные
Вопрос:
Ниже приведен код из руководства по ERB. Когда я попытался выполнить код, компилятор пожаловался, сказав «(erb): 16: неопределенная локальная переменная или метод `priority’ для main:Object (NameError)». Я не могу понять причину. Кто-нибудь, пожалуйста, может мне помочь?
require "erb"
# Create template.
template = %q{
From: James Edward Gray II <james@grayproductions.net>
To: <%= to %>
Subject: Addressing Needs
<%= to[/w /] %>:
Just wanted to send a quick note assuring that your needs are being
addressed.
I want you to know that my team will keep working on the issues,
especially:
<%# ignore numerous minor requests -- focus on priorities %>
% priorities.each do |priority|
* <%= priority %>
% end
Thanks for your patience.
James Edward Gray II
}.gsub(/^ /, '')
message = ERB.new(template, 0, "%<>")
# Set up template data.
to = "Community Spokesman <spokesman@ruby_community.org>"
priorities = [ "Run Ruby Quiz",
"Document Modules",
"Answer Questions on Ruby Talk" ]
# Produce result.
email = message.result
puts email
Ответ №1:
Этот шаблон ERB выглядит искаженным, проблема вызвана вашим отступом. Вам просто нужно исправить середину:
<% priorities.each do |priority| %>
* <%= priority %>
<% end %>
Альтернативный синтаксис заключается в том, чтобы иметь %
в самом начале строки. В вашем случае вы непреднамеренно добавили некоторые пробелы, которые делают эту часть ERB недействительной.
Комментарии:
1. кстати, что делает gsub в этом случае? заменить внутри шаблона или сгенерированного текста?
2. Он удаляет первые два пробела в начале каждой строки в строке. Кажется, это устраняет проблему с отступом, но на самом деле это неоптимальное решение. Здесь лучше использовать документ в
<<
стиле.