【问题标题】:Rails 4.1 Mailer Previews and Devise custom emailsRails 4.1 Mailer 预览和设计自定义电子邮件
【发布时间】:2014-07-06 03:40:33
【问题描述】:

我有一个全新的 Rails 4.1.1 应用程序,我正在其中自定义设计电子邮件。我想让它们显示在新的 Rails 电子邮件预览功能上,所以我做了以下操作:

1) 将以下 sn-p 添加到我的 config/development.rb 文件中:

config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"

2) 在app/mailers/user_mailer.rb 中创建了我的自定义设计电子邮件UserMailer

class UserMailer < Devise::Mailer   
  helper :application # gives access to all helpers defined within `application_helper`.
  include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url`

  layout "notifications_mailer"
end

3) 将config/initializers/devise.rb 更改为包含以下 sn-p:

config.mailer = 'UserMailer'

4) 将UserMailerPreview 类添加到lib/mailer_previews,内容如下:

class UserMailerPreview < ActionMailer::Preview
  def confirmation_instructions
    UserMailer.confirmation_instructions(User.first, {})
  end

  def reset_password_instructions
    UserMailer.reset_password_instructions(User.first, {})
  end

  def unlock_instructions
    UserMailer.unlock_instructions(User.first, {})
  end
end

到目前为止,一切都很好。看起来我做的一切都是正确的。但后来我尝试在 /rails/mailers/user_mailer/confirmation_instructions 路由中查看 confirmation_instructions 电子邮件的预览,我收到以下错误:

undefined method `confirmation_url' for #<#<Class:0x007fa02ab808e0>:0x007fa030fb7e80>

我的confirmation_url.html.erb 模板的代码如下所示:

<%= t("notifications.texts.greeting") + @user.display_name %>,

<p>You can confirm your account email through the link below:</p>

<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token =>  @token) %></p>

我做错了什么?我想我调用confirmation_url 方法的方式有问题。任何人都可以在这里帮助我吗?

【问题讨论】:

  • 你在哪里打电话给confirmation_url?您能否分享出现此错误的相关代码。
  • 啊,在视图中。更新了帖子
  • 我听从了@steel 的建议,并得到了它的工作。我还必须重新启动服务器才能使更改生效。

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


【解决方案1】:

对于那些希望在不使用自定义邮件程序的情况下预览设计电子邮件的人(但仍然是自定义电子邮件),这就是我所做的:

  1. 配置您的应用以进行电子邮件预览。

  2. 设置 Devise Mailer Preview 类

    一个。导轨 ~> 4.1

    # mailer/previews/devise_mailer_preview.rb
    class Devise::MailerPreview < ActionMailer::Preview
    
      def confirmation_instructions
        Devise::Mailer.confirmation_instructions(User.first, "faketoken")
      end
    
      def reset_password_instructions
        Devise::Mailer.reset_password_instructions(User.first, "faketoken")
      end
    
      ...
    
    end
    

    b.导轨 ~> 5.0

    class DeviseMailerPreview < ActionMailer::Preview
    
      ... # same setup as Rails 4 above
    
  3. 重启服务器

【讨论】:

  • 感谢您的回答。有效。我还不知道如何测试 reset_password_instructions 因为我不知道要传递哪些参数。 PS:你必须再缩进一级,因为代码在列表中。
  • @Besi,感谢格式帮助。要测试密码重置,只需传递一个用户和一个字符串,如下所示:Devise::Mailer.reset_password_instructions(User.first, "faketoken")
  • 但是我在这里,网址是什么?我做了 config.action_mailer.preview_path = "#{Rails.root}/app/mailers/previews",但 localhost:3000/rails/mailers 什么也没返回:/
  • 很明显,我无法确认您的端口,但这是相对路径。
  • 试试这个localhost:3000/rails/mailers/devise/mailer/
【解决方案2】:

使用 Rails 5 发现语法与 @steel 的优秀答案略有不同,区别在于使用双“::”:

# Preview all emails at http://localhost:3000/rails/mailers/devise_mailer
class DeviseMailerPreview < ActionMailer::Preview

    def reset_password_instructions
        Devise::Mailer.reset_password_instructions(User.first, "faketoken")
    end
end

【讨论】:

  • 当使用 gem 'rails', '~> 5.1.6' 时,它只能使用 ::。没有 :: 得到 'Mailer preview 'devise/mailer/reset_password_instructions' not found'
【解决方案3】:

当您忘记在模型中包含必要的设计模块时,您将获得设计 url 帮助程序的未定义方法。例如如果您的模型是 User 并且您想要 confirmation_url,则必须确保包含 :confirmable 模块:

devise <...snipped...>, :confirmable

请注意,如果当前加载此模块,则您的应用程序很可能不会使用例如确认!

包含 :confirmable 模块可能会锁定所有用户。见https://github.com/plataformatec/devise/wiki/How-To:-Add-:confirmable-to-Users

【讨论】:

    【解决方案4】:

    我发现这个问题是因为我试图弄清楚如何自己预览设计电子邮件。我几乎完全复制了你的代码,它对我来说很好。

    唯一不同的是,我从UserMailer 中删除了layout "notifications_mailer" 行——当我包含它时,我收到了一条错误消息Missing template layouts/notifications_mailer。如果删除它会发生什么?

    Devise::Controllers::UrlHelpers 行肯定包含 confirmation_url 方法(您可以通过打开 Rails 控制台并运行 include Devise::Controllers::UrlHelpers 然后运行 ​​confirmation_url 来亲自看到这一点,所以我怀疑问题是您的预览不是完全被UserMailer 渲染。我不知道为什么,但layout "notifications_mailer" 可能是罪魁祸首。

    你有一个名为NotificationsMailer 的类吗?包含Devise::Controllers::UrlHelpers 能解决你的问题吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 2012-09-03
      • 2018-05-27
      • 1970-01-01
      • 2013-05-21
      相关资源
      最近更新 更多