Проблема с url-адресом и именованными маршрутами в представлении ActionMailer: "нужен контроллер и действие"


Я пытаюсь предоставить ссылку подтверждения в моем приветственном письме пользователя, и я получаю следующую ошибку Rails:

Need controller and action!

Он поднимает шум из-за этой строки:

<p>Please take a moment to activate your account by going to: 
<%= link_to confirm_user_url(:id => @user.confirmation_code) %>.</p>

В моем окружении development.rb у меня есть следующая строка:

config.action_mailer.default_url_options = {
  :host => "localhost", :port => 3000
}

Нет никаких проблем с переменной @user. Я проверил электронную почту с такими вещами, как @user.username и @user.confirmation_code. У меня только проблемы с url_for и названными маршрутами, такими как confirm_user_url.

Когда я проверяю свои маршруты с помощью rake routes, confirm_user появляется, так что это не проблема с именем маршрута не существует.

Я, кажется, не могу понять этого. Что это дает?
2 3

2 ответа:

Поскольку наличие кликабельного url-адреса-это то, что вы сказали в своем where after в своем комментарии, вот вам macek

<p>Please take a moment to activate your account by going to: 
<%= auto_link confirm_user_url(:id => @user.confirmation_code) %>.</p>

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

ActionMailer не является реальным контроллером Rails, поэтому маршруты недоступны в шаблонах ваших почтовых программ. Для передачи значений в шаблон необходимо настроить переменные экземпляра в классе mailer.

Напр. если ваш почтовый клиент SampleMailer:

class SampleMailer < ActionMailer::Base

  def confirmation_mail(user)
    subject    'Confirmation'
    recipients user.email
    from       'sample@example.com'
    sent_on    Time.now
    body       :greeting => 'Sample Greeting', :email => user.email,
               :confirm_user_url => confirm_user_url(:id=>@user.confirmation_code)
  end
end

Затем в шаблоне:

<%= link_to "Confirmation link", @confirm_user_url %>

Это объясняется несколько загадочно в api в разделе "ActionMailer", а более подробно в Agile Web Development with Rails, 3-е изд.[10], Глава 25.