Подтвердить что ты не робот

Rails 4.1 Предварительный просмотр Mailer и разработка пользовательских писем

У меня есть новое приложение Rails 4.1.1, в котором я настраиваю электронные письма. Я хочу, чтобы они отображались в новой функции предварительного просмотра электронной почты Rails, поэтому я сделал следующее:

1) Добавлен следующий фрагмент в мой файл config/development.rb:

config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"

2) Создал мой пользовательский адрес электронной почты UserMailer в app/mailers/user_mailer.rb:

class UserMailer < Devise::Mailer   
  helper :application # gives access to all helpers defined within `application_helper`.
  include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url`

  layout "notifications_mailer"
end

3) Изменен config/initializers/devise.rb, содержащий следующий фрагмент:

config.mailer = 'UserMailer'

4) Добавлен класс UserMailerPreview в lib/mailer_previews со следующим содержимым:

class UserMailerPreview < ActionMailer::Preview
  def confirmation_instructions
    UserMailer.confirmation_instructions(User.first, {})
  end

  def reset_password_instructions
    UserMailer.reset_password_instructions(User.first, {})
  end

  def unlock_instructions
    UserMailer.unlock_instructions(User.first, {})
  end
end

До сих пор так хорошо. Похоже, я все сделал правильно. Но затем я пытаюсь просмотреть предварительный просмотр сообщения confirmation_instructions по маршруту /rails/mailers/user _mailer/confirm_instructions, и я получаю следующую ошибку:

undefined method `confirmation_url' for #<#<Class:0x007fa02ab808e0>:0x007fa030fb7e80>

код для моего шаблона confirmation_url.html.erb выглядит следующим образом:

<%= t("notifications.texts.greeting") + @user.display_name %>,

<p>You can confirm your account email through the link below:</p>

<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token =>  @token) %></p>

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

4b9b3361

Ответ 1

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

Единственное, что я сделал по-другому, это удалить строку layout "notifications_mailer" из UserMailer - когда я включил ее, я получил сообщение об ошибке Missing template layouts/notifications_mailer. Что произойдет, если вы удалите его?

Строка Devise::Controllers::UrlHelpers определенно включает в себя метод confirmation_url (вы можете это увидеть сами, открыв консоль Rails и запустив include Devise::Controllers::UrlHelpers, затем confirmation_url, поэтому я подозреваю, что проблема заключается в том, что ваши предварительные просмотры не являются вообще говоря, UserMailer. Я не уверен, почему, но строка layout "notifications_mailer" может быть виновником.

У вас есть класс под названием NotificationsMailer? Включает ли в него Devise::Controllers::UrlHelpers решение вашей проблемы?

Ответ 2

Для тех, кто хочет предварительно просматривать электронные письма Devise без использования специальных почтовых программ (но все же пользовательских электронных писем), это то, что я сделал:

  1. Настройте приложение для предварительного просмотра электронной почты.

  2. Настройте класс предварительного просмотра Devise Mailer

    а. Rails ~> 4.1

    # mailer/previews/devise_mailer_preview.rb
    class Devise::MailerPreview < ActionMailer::Preview
    
      def confirmation_instructions
        Devise::Mailer.confirmation_instructions(User.first, "faketoken")
      end
    
      def reset_password_instructions
        Devise::Mailer.reset_password_instructions(User.first, "faketoken")
      end
    
      ...
    
    end
    

    б. Rails ~> 5.0

    class DeviseMailerPreview < ActionMailer::Preview
    
      ... # same setup as Rails 4 above
    
  3. Перезагрузите сервер

Ответ 3

Вы получите неопределенный метод для помощников URL-адреса устройства, если вы забыли включить необходимые модули devise в свою модель. Например, если ваша модель - User и вы хотите, чтобы поле confirmation_url, вы должны убедиться, что :confirmable модуль включен:

devise <...snipped...>, :confirmable

Помните, что если этот модуль еще не загружен, то ваше приложение, скорее всего, не использует, например, подтверждения!

Включение: подтверждаемого модуля может затем заблокировать всех ваших пользователей. См. Https://github.com/plataformatec/devise/wiki/How-To:-Add-:confirmable-to-Users.

Ответ 4

Используя Rails 5 и нашел синтаксис, немного отличающийся от превосходного ответа @steel, с использованием двойной "::", являющейся разницей:

# Preview all emails at http://localhost:3000/rails/mailers/devise_mailer
class DeviseMailerPreview < ActionMailer::Preview

    def reset_password_instructions
        Devise::Mailer.reset_password_instructions(User.first, "faketoken")
    end
end