Ruby/Rails:您如何自定义 Devise 的邮件模板?

Posted

技术标签:

【中文标题】Ruby/Rails:您如何自定义 Devise 的邮件模板?【英文标题】:Ruby/Rails: How do you customize the mailer templates of Devise? 【发布时间】:2022-01-04 14:16:44 【问题描述】:

我已经为我的 Rails 应用程序 (3.0.1) 安装了 Devise,它大部分都在工作。我只是似乎无法自定义邮件视图

我的用户模型是“用户”。 设计控制器(我需要覆盖它以便我可以告诉控制器要使用的布局文件)在app/controllers/users/ 中,就像app/controllers/users/sessions_controller.rb 设计视图(我已编辑)在app/views/users/ 中,就像app/views/users/registrations/new.html.haml 这是我的路线文件的设计部分: devise_for :users, :controllers => :sessions => "用户/会话", :registrations => "用户/注册", :passwords => "用户/密码", :confirmations => "用户/确认", :unlocks => "用户/解锁" 做 获取“/登录”=>“设计/会话#new” 获取“/注销”=>“设计/会话#destroy” 结尾

至少上面的一切都有效。但是,在发送邮件时,Devise 使用的模板似乎不是我在app/views/users/mailer/ 编辑过的模板。设计似乎仍然选择默认的(好像我从未编辑过文件)。我猜 Devise 仍然使用 gem 中的文件。

如果有帮助,这里是 Cucumber 错误:

Feature: Manage accounts
  In order to manage accounts
  users
  should be able to signup

  # By default, www.example.com is the host when testing.
  # This is a problem because when our site searches for the domain example.com, it cant find any.
  # Therefore we must either set our testing domain to one of our choosing (and mention that in the routes), or create a domain example.com
  # I prefer the first option.
  Scenario: Signing up and resetting the password                                                                      # features/manage_accounts.feature:10
    Given I am on the login page                                                                                       # features/step_definitions/web_steps.rb:19
    When I follow "Sign up"                                                                                            # features/step_definitions/web_steps.rb:33
    And I fill in "Login" with "bobrobcom"                                                                             # features/step_definitions/web_steps.rb:39
    And I fill in "Email" with "my@email.com"                                                                          # features/step_definitions/web_steps.rb:39
    And I fill in "Password" with "123456"                                                                             # features/step_definitions/web_steps.rb:39
    And I fill in "Password confirmation" with "123456"                                                                # features/step_definitions/web_steps.rb:39
    And I press "Sign up"                                                                                              # features/step_definitions/web_steps.rb:27
    Then I should see "Your account has been created. A confirmation was sent to your e-mail."               # features/step_definitions/web_steps.rb:107
    And I should receive an email                                                                                      # features/step_definitions/email_steps.rb:51
    When I open the email                                                                                              # features/step_definitions/email_steps.rb:72
    Then I should see "Welcome bobrobcom!" in the email body                                                           # features/step_definitions/email_steps.rb:96
      expected "<p>Welcome my@email.com!</p>\n\n<p>You can confirm your account through the link below:</p>\n\n<p><a href=\"http://stils.dev/users/confirmation?confirmation_token=d9ZXliqfTArb2cNmwPzL\">Confirm my account</a></p>\n" to include "Welcome bobrobcom!" (RSpec::Expectations::ExpectationNotMetError)
      ./features/step_definitions/email_steps.rb:97:in `/^(?:I|they) should see "([^"]*?)" in the email body$/'
      features/manage_accounts.feature:21:in `Then I should see "Welcome bobrobcom!" in the email body'
    When I follow "Confirm my account"                                                                                 # features/step_definitions/web_steps.rb:33
    Then I should see "Your account was successfully confirmed. You are now signed in."                                # features/step_definitions/web_steps.rb:107
    When I log out                                                                                                     # features/step_definitions/user_steps.rb:9
    And I go to the reset password page                                                                                # features/step_definitions/web_steps.rb:23
    And I fill in "Email" with "my@email.com"                                                                          # features/step_definitions/web_steps.rb:39
    And I press "Send me reset password instructions"                                                                  # features/step_definitions/web_steps.rb:27
    Then I should see "You will receive an email with instructions about how to reset your password in a few minutes." # features/step_definitions/web_steps.rb:107
    And I should receive an email                                                                                      # features/step_definitions/email_steps.rb:51
    When I open the email                                                                                              # features/step_definitions/email_steps.rb:72
    Then I should see "Hello bobrobcom!" in the email body                                                             # features/step_definitions/email_steps.rb:96
    When I follow "Change my password" in the email                                                                    # features/step_definitions/email_steps.rb:166
    Then I should see "Set your new password"                                                                          # features/step_definitions/web_steps.rb:107

Failing Scenarios:
cucumber features/manage_accounts.feature:10 # Scenario: Signing up and resetting the password

还有 app/views/users/confirmation_instructions.erb:

<p>Welcome <%= @resource.login %>!</p>

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

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

另外,如果有帮助,这里是我覆盖的控制器:

| | |~users/
| | | |-confirmations_controller.rb
| | | |-passwords_controller.rb
| | | |-registrations_controller.rb
| | | |-sessions_controller.rb
| | | `-unlocks_controller.rb

我该如何解决这个问题?

谢谢!

【问题讨论】:

【参考方案1】:

如果您只想生成电子邮件视图,可以使用:rails g devise:views [SCOPE] -v mailer。在您的情况下,[SCOPE]users

注意:我使用的是 Devise 4.7.3

【讨论】:

【参考方案2】:

如果您有兴趣不使用 Devise 的默认 ActionMailer 用法,而是希望使用来自 SendGrid、Mailgun 或 Mailgun 或 Postmark 等服务的 API 发送自定义电子邮件,您将需要创建自定义 @ 987654325@ 是 Devise::Mailer 的子类并覆盖其“通知”方法。

这是example using Mailgun。

【讨论】:

【参考方案3】:

我认为您需要自己管理设计视图。在控制台中尝试以下操作:

rails generate devise:views

这将生成 Devise 使用的所有视图(包括邮件模板),您现在可以对其进行自定义。

您要查找的邮件程序应位于“app/views/devise/mailer”中

如果您想生成范围视图,或者只生成其中的一个子集,这也是可能的。根据https://github.com/plataformatec/devise#configuring-views 的文档:

您还可以使用生成器生成范围视图:

rails generate devise:views users

如果您只想生成几组视图,例如可注册和可确认模块的视图,您可以使用 -v 标志将模块列表传递给生成器。

rails generate devise:views -v registrations confirmations

【讨论】:

我很困惑——因为我所有的东西都在用户命名空间下,视图应该在“app/views/users/”下吗?这就是我现在所拥有的,当我编辑其他内容的视图(例如应用程序/视图/用户/注册)时,它反映了我的应用程序的更改。 不是应用程序/视图/用户/邮件视图。 看来您在正确的位置放置了邮件模板。看看这个帖子groups.google.com/group/plataformatec-devise/browse_thread/…,也许它可以为你指明正确的方向? 嗨,我和发帖人有同样的问题,这个答案并不是真正的答案。我有一个解决方案,即将我的视图/用户符号链接到视图/设计;这样,设计使用定制的邮件模板。但是该解决方案并不干净,我不想同时拥有设计和用户目录。其他人可以澄清一下吗? 当我调用这个 rails generate devise:views 时,我确实搞砸了在应用程序中完成的很多工作,现在工作很可爱,真的没有办法只生成邮件吗? 尝试使用 devise(相同的 Gemfile)创建一个新的空项目,生成电子邮件,然后将它们复制过来。【参考方案4】:

资源名称

生成视图
rails generate devise:views users

通过recoverable模块生成指定视图

rails generate devise:views users -v passwords

仅生成指定的邮件视图

rails generate devise:views users -v mailer 

更多详情generate views

【讨论】:

【参考方案5】:

试试这个:

rails generate devise:views

【讨论】:

【参考方案6】:

根据devise's docs

你应该编辑你的 config/initializers/devise.rb:

config.scoped_views = true

(默认注释)

通过这样做,您可以为不同的模型而不是全局设计自定义视图。

【讨论】:

设置此配置选项后,运行rails g devise:views [SCOPE],其中 SCOPE 是单一化的资源名称(例如用户、客户、管理员等)。 @Zubin 请注意in the Devise documentation一个复数范围被传递给生成器。

以上是关于Ruby/Rails:您如何自定义 Devise 的邮件模板?的主要内容,如果未能解决你的问题,请参考以下文章

markdown [rails:devise] Ruby on Rails的身份验证gem。 #ruby #rails

Ruby Rails 在控制器中模拟 Devise authed 用户

ruby Rails中自定义rake任务

Ruby on Rails 学习五Ruby语言的方法

如何将自定义字段添加到 devise_invitable 邀请表单

如何在 Sass 中使用 Ruby/Rails 变量?