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 用户