访问助手从邮件?
我试图从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
助手可以访问。 有必要使用想要的助手的*_url
forms。 因此,例如,不要使用user_path(@user)
,而必须使用user_url(@user)
。 请参阅操作邮件程序的基本知识 。
一个黑客的手段,实现我想要的是将我需要的对象(current_user.name + current_user.email)存储在线程属性,如下所示: Thread.current[:name] = current_user.name
。 然后在我的邮件程序中,我只是将新的实例variables分配给存储在线程中的值: @name = Thread.current[:name]
。 这个工作,但如果使用延迟工作的东西,它不会工作。