2013-06-03 5 views
1

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

Я пробовал что-то вроде этого, которое работает, если я вручную визуализую erb, но если я попытаюсь отправить электронное письмо, я бросаю.

<% 
class EmailBox 
    attr_accessor :text, :textLink, 
end 
x = EmailBox.new 
x.textLink = 'https://www.google.com/' 
x.text = 'blah' 
@boxes = [] 
@boxes.push x 
%> 

<% @boxes.each do |row| %> 
     <a style="text-decoration:none;color:#666;" href="<%=row.textLink%>"><%=row.text%></a> 
<% end %> 

Ошибка я получаю:

/Users/x/appname/app/views/clip_mailer/send_clip_with_destination.html.erb:205: class definition in method body 
/usr/local/rvm/gems/ruby-1.9.3-p392/gems/actionpack-3.2.13/lib/action_view/template.rb:297:in `module_eval' 
/usr/local/rvm/gems/ruby-1.9.3-p392/gems/actionpack-3.2.13/lib/action_view/template.rb:297:in `compile' 
/usr/local/rvm/gems/ruby-1.9.3-p392/gems/actionpack-3.2.13/lib/action_view/template.rb:244:in `block in compile!' 
<internal:prelude>:10:in `synchronize' 
/usr/local/rvm/gems/ruby-1.9.3-p392/gems/actionpack-3.2.13/lib/action_view/template.rb:232:in `compile!' 

Я повторяюсь, но это прекрасно работает, когда я вручную вынести шаблон, открыв его на диске и работает ERB.new(file).result(binding)

+0

Почему вы не кладете декларацию класса в модель и все наполняющие вещества в контроллер? –

+0

Я просто использую этот простой класс один раз, чтобы создать тело письма. это не относится ни к чему другому. Я также не перебираю записи базы данных или что-то еще, я вручную создаю эти повторяющиеся блоки. – portforwardpodcast

+1

Размещение класса в моделях не означает, что вы используете базу данных, это может быть просто класс (модель). Это и логика в контроллере - это соглашение, и это важно. :) –

ответ

0

Кто-то ответил: "Если вы действительно хотите, чтобы определить класс внутри шаблона можно использовать a Struct ... ", а затем удалил его. Я не знаю, кто, но я получил сообщение по электронной почте. В любом случае это привело меня к путям структур, и в итоге я нашел OpenStruct. Преобразование очень простое и занимает меньше строк:

<% 
x = OpenStruct.new 
x.textLink = 'https://www.google.com/' 
x.text = 'blah' 
@boxes = [] 
@boxes.push x 
%> 

<% @boxes.each do |row| %> 
     <a style="text-decoration:none;color:#666;" href="<%=row.textLink%>"><%=row.text%></a> 
<% end %> 
1

Вы не можете, насколько мне известно, определить классы внутри erb. Даже если бы вы могли, я бы поставил под вопрос логику проектирования такого подхода - в общем, вы хотите сохранить стену разделения между вашими данными и шаблонами.

Все, что сказал, вы можете сделать что-то подобное с помощью метода, который возвращает список или хэш, и т.д.:

<% def get_data; return {:text => 'blah', :textLink => 'http://www.google.com'}; end %> 
<%= get_data[:textLink] %> 
+0

Мне нравится ваше решение, но это означает, что я должен ввести дополнительный [:] для каждой выборки. Я слишком ленив для этого. Типичный рубист нет? – portforwardpodcast

+1

Rubyists, которые не любят печатать двоеточие, недолго для этого мира;) Решение OpenStruct - это более точное сопоставление с вашими заявленными требованиями, так что рад, что это получилось. – dliggat

+0

Я хочу, чтобы тот, кто прокомментировал это, оставил свой ответ. Мне очень повезло, что SO отправил мне электронное письмо. Не думаю, что для него это не проблема. – portforwardpodcast