Проблема с url_for и именованными маршрутами в ActionMailer View: «Требуется контроллер и действие» - PullRequest
3 голосов
/ 22 апреля 2010

Я пытаюсь предоставить ссылку для подтверждения в приветственном письме пользователя и получаю следующую ошибку 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 ]

9 голосов
/ 22 апреля 2010

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

например.если ваш почтовик 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 с Rails, 3-е изд. , Глава 25.

3 голосов
/ 23 апреля 2010

Поскольку URL-адрес, по которому можно кликнуть, - это то, что вы сказали в комментарии where, здесь вы идете 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 для всех вариантов.Наслаждайтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...