ActionMailer中url_for和命名路由的问题视图:“需要控制器和操作”

时间:2010-04-21 22:58:07

标签: ruby-on-rails development-environment routes 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_forconfirm_user_url等命名路线的问题。

当我使用rake routes检查我的路线时,显示confirm_user,因此不存在命名路线不存在的问题。

我似乎无法弄明白。是什么给了什么?

2 个答案:

答案 0 :(得分:9)

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 %>

“ActionMailer”部分的api更详细地解释了这一点,第25章Agile Web Development with Rails, 3rd Ed.更详细地解释了这一点。

答案 1 :(得分:3)

由于您的评论中有一个可点击的网址就是您所说的,所以请点击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帮助程序来使网址可以点击,而且效果非常好。我认为这也是电子邮件地址,请查看所有选项的完整API。享受。