Странная проблема с объектом при попытке частичного рендеринга из представления mailer

#ruby-on-rails #views #mailer

#ruby-on-rails #Вид #mailer

Вопрос:

Используя Rails 3. Согласно первому фрагменту кода ниже, трудно выполнить поиск в Google, что означает эта ошибка при попытке отрисовки части из моего представления mailer.

Это ошибка:

 ActionView::Template::Error (undefined method `long_date' for #<#<Class:0x00000102452ab0>:0x00000102440b30>):
  

Вот мое представление mailer (email_note.html.erb)

 <div style="width:500px;">
  <%= render :partial => "shared/note", :object => @note %>
</div>
  

Это вызов, который я выполняю в своем partial, который выдает ошибку
<%= long_date(примечание.created_at) %>

long_date всегда срабатывало, когда я предоставлял частичные объекты @note из других действий (например, «показать» в моем notes_controller). это метод

 def long_date(date)
  date.strftime('%A %b %e, %G')
end
  

Вот мой класс ActionMailer (адрес и note_id отправляются из действия «email» в моем notes_controller)

 class UserMailer < ActionMailer::Base
 default :from => "gminett@gmail.com"

  def email_note(address,note_id)
    @note = Note.find(note_id)
    mail(:to => "#{address}", :subject => "Note from repository: #{@note.subject}")
  end
end
  

Мне кажется, rails (скорее всего, из-за некоторой оплошности с моей стороны) не интерпретирует мой объект @note как класс Note, но я не знаю, как это исправить. Помощь очень ценится.

Ответ №1:

Это связано с тем, что по умолчанию шаблоны ActionMailer не используют те же помощники, что и шаблоны ActionView. Если вам нужно использовать помощников в ваших шаблонах mailer, попробуйте включить модуль в свой класс ActionMailer:

 include DateTimeHelper
  

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

1. Когда я добавляю включить DateTimeHelper чуть ниже моего

2. … (слишком быстрый ввод) class UserMailer < ActionMailer::Base я получаю следующую ошибку: NameError (неинициализированная константа UserMailer::DateTimeHelper):

3. Скорее всего, вам придется запросить файл над программой mailer. Это работает?