【问题标题】:How to use Devise helpers in ActionMailer?如何在 ActionMailer 中使用设计助手?
【发布时间】:2014-03-25 14:40:08
【问题描述】:

我可以在常规视图中使用 Devise 辅助方法,但不知道如何在我的 Mailer 中使用它。我需要确定用户是否已登录以构建正确的电子邮件。

class UserMailer < ActionMailer::Base
  def receipt
  end
end

receipt.text.erb

<% if user_signed_in? %> #Error: undefined method `user_signed_in?' for #<#<Class:0x35695fc>
    Secret link
<% end %>

【问题讨论】:

  • 假设,用户在两台机器上收到这封电子邮件:一台他已登录,另一台未登录。你现在在干什么? (提示:正确的电子邮件不应该取决于用户的登录状态
  • 您有上次登录时间的时间戳吗?设计可以提供这个。然后使用 Active Record 获取该属性并确定它是否在最后 X 分钟内。

标签: ruby-on-rails ruby-on-rails-4 devise actionmailer


【解决方案1】:

实际上,您不能,最重要的是,您不应该在邮件中使用这种 Devise 助手。

为什么?好吧,如果您在 Devise 的代码库中搜索 user_signed_in? 帮助程序,您会在 Devise::Controllers::Helpers 模块中找到它,如您所见 here。这意味着它应该在控制器上下文中使用,因为它使用诸如 requestwarden 之类的方法,而这些方法仅在控制器上可用。

如果您必须根据用户是否登录在您的邮件视图中做出任何决定,我建议您将此信息从您的控制器传递到您的邮件程序:

您的控制器:

class UserController < ApplicationController
  def your_action
    UserMailer.receipt(user_signed_in?).deliver
    #....
  end
end

您的邮件:

class UserMailer < ActionMailer::Base
  def receipt(signed_in)
    @signed_in = singed_in
    #....
  end 
end

您的邮件视图:

<% if @signed_in %>
  Secret link
<% end %>

希望对你有帮助!

【讨论】:

    【解决方案2】:

    你可以从助手那里传递它。像这样的

    class UserMailer < ActionMailer::Base
      def receipt
        @is_signed = user_signed_in?
      end
    end
    

    <% if @is_signed %>
      Secret link
    <% end %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多