访问助手从邮件?

我试图从rails 3邮件程序访问帮助程序方法,以访问会话的当前用户。

我把助手:应用程序在我的邮件类,似乎工作,除了在其中定义的方法不可用我的邮件(我得到未定义的错误)。 有谁知道这应该如何工作?

这是我的class级:

class CommentMailer < ActionMailer::Base default :from => "Andre Fournier <andre@gfournier.com>" helper :application end 

谢谢,肖恩

为了使您能够从ActionMailer视图访问应用程序助手,请尝试添加以下内容:

 add_template_helper(ApplicationHelper) 

到你的ActionMailer(就在你的default :from line)。

使用helper ApplicationHelper

 class NotificationsMailer < ActionMailer::Base default from: "Community Point <Team@CommunityPoint.ca>" helper ApplicationHelper helper NotificationMailerHelper # ...other code... 

注:这些帮助器方法仅适用于视图 。 他们不是在邮件类( NotificationMailer在我的例子)中可用。

如果您在实际的邮件程序类中需要它们,请使用include ApplicationHelper ,如下所示:

 class NotificationMailer < ActionMailer::Base include ApplicationHelper # ... the rest of your mailer class. end 

从这个其他的SO问题 。

这是一个非常古老的问题,但我没有看到完整的答案,所以我会尝试,因为我没有find其他资源。

这取决于你在辅助模块中定义的方法。 如果它们是类方法,并且没有在特定实例上调用的所有东西似乎都是3.2.13的类方法,则需要使用

 extend ApplicationHelper 

如果一个实例的方法

 include ApplicationHelper 

如果你想在邮件视图中使用它们

 helper ApplicationHelper 

你可以尝试混合所需的帮助模块:

 class CommentMailer < ActionMailer::Base include ApplicationHelper end 

Josh Pinter的回答是正确的,但我发现这是没有必要的。

什么必要的正确命名助手。

NotificationMailerHelper是正确的。 NotificationMailersHelper (注意s)不正确。

助手的类和文件名必须匹配并且拼写正确。

Rails 3.2.2

include ActionView::Helpers::TextHelper在Mailer控制器(.rb文件)中为我工作的include ActionView::Helpers::TextHelper 。 这使我可以在Mailer控制器动作中使用pluralize helper(助手可以从Mailer视图中进入)。 没有其他答案的工作,至less不在Rails 4.2

如果你想从ActionMailer中调用helper方法,你需要在Mailer文件中包含helper(模块),如果Helper模块名称是“UserHelper”,那么需要在Mailer文件中写下如下

 class CommentMailer < ActionMailer::Base default :from => "Andre Fournier <andre@gfournier.com>" add_template_helper(UserHelper) end 

要么

 class CommentMailer < ActionMailer::Base default :from => "Andre Fournier <andre@gfournier.com>" include UserHelper end 

希望这是有帮助的。

我不确定你到底在做什么,但是当我想从一个邮件程序中访问current_user的时候,我把一个邮件程序的方法传递给了一个参数:

 class CommentMailer < ActionMailer::Base default :from => "Andre Fournier <andre@gfournier.com>" def blog_comment(user) @recipients = user.email @from = "andre@gfournier.com" @sent_on = Time.now @timestamp = Time.now @user = user end end 

通过以上所述,@user以及所有其他实例variables都可以从邮件程序视图中访问./views/comment_mailer/blog_comment.html.erb和./views/comment_mailer/blog_comment.text.erb

另外,你可以让一个帮手叫

comment_mailer_helper.rb

并把任何你希望可以用于你的邮件视图的方法放进那个帮手。 在我看来,对于帮助者来说,更像是你想要的,因为帮助者被devise为帮助观看,而邮件程序类似于控制器。

在ApplicationController中提供的帮助方法的单一方法版本也可以在ActionMailer中使用:

 class ApplicationMailer < ActionMailer::Base helper_method :marketing_host def marketing_host "marketing.yoursite.com" end end 

从那里你可以从任何邮件视图调用marketing_host

在电子邮件中,默认情况下,没有一个*_path助手可以访问。 有必要使用想要的助手的*_urlforms。 因此,例如,不要使用user_path(@user) ,而必须使用user_url(@user) 。 请参阅操作邮件程序的基本知识 。

一个黑客的手段,实现我想要的是将我需要的对象(current_user.name + current_user.email)存储在线程属性,如下所示: Thread.current[:name] = current_user.name 。 然后在我的邮件程序中,我只是将新的实例variables分配给存储在线程中的值: @name = Thread.current[:name] 。 这个工作,但如果使用延迟工作的东西,它不会工作。