我正在使用Devise在rails 4应用程序中创建/记录用户,并且我在覆盖视图方面遇到了一些问题。
我使用我的新视图生成了设计视图和控制器,并且它们正常工作。为了创建这些视图,我使用了:
rails generate devise:views admins
当它尝试发送邮件时出现问题,它仍然使用设计默认视图:
app/views/devise/mailer/confirmation_instructions.html.erb
其他视图已正确加载到我的/ admins / sessions和类似的文件中。
我也在config.scoped_views = true
设置了devise.rb
。
尝试使用自定义邮件程序并将模板路径设置为我的视图,但它既不起作用(它仍尝试使用设计视图发送邮件):
default template_path: 'blablabla/admins/mailer'
知道什么是错的吗?
答案 0 :(得分:3)
所以这不是完美的,但它为我工作......
从自定义控制器传递opts param以获取电子邮件版本
UserNotificationsMailer.confirmation_instructions(user, user.confirmation_token, { subject: "Please confirm your account.", version: "request" } ).deliver_later
然后在方法
中设置实例变量def confirmation_instructions(record, token, opts={})
@version = opts[:version]
super
end
并在confirmation_instructions.html.erb中使用该变量
<% if @version.nil? %>
<p>Welcome <%= @email %>!</p>
<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>
<% elsif @version == "request" %>
<p><b>From: location.org</b></p>
<p> <b>Subject:</b> <%= @subject %> </p>
<p>We noticed you signed up for an account...but have not confirmed yet.</p>
<p>Confirm you account now and get started!</p>
<p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>
<p> Respond to <%= mail_to(@email) %> </p>
<% elsif @version == "warn" %>
<p><b>From: location.org</b></p>
<p> <b>Subject:</b> <%= @subject %> </p>
<p>We noticed you signed up for an account ... confirmed soon it may be scheduled for removal.</p>
<p>Confirm you account now and get started!</p>
<p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>
<p> Respond to <%= mail_to(@email) %> </p>
<% end %>
没有补丁,这是好的,并发送不同的版本。仍然在寻找一个完美的解决方案,但它暂时有用。
答案 1 :(得分:1)
在config / initializers / devise.rb中尝试定义模板文件,如下所示:
Rails.application.config.to_prepare do
Devise::SessionsController.layout "admin/registration"
Devise::RegistrationsController.layout proc { |controller| user_signed_in? ?
"admin/application" : "admin/registration" }
Devise::ConfirmationsController.layout "admin/registration"
Devise::UnlocksController.layout "admin/registration"
Devise::PasswordsController.layout "admin/registration"
Devise::Mailer.layout "mailer/user_email"
end
最后一行是配置邮件程序布局模板。
答案 2 :(得分:0)
这个猴子补丁对我有用。
Devise::Mapping.class_eval do
def self.find_scope!(obj)
obj = obj.devise_scope if obj.respond_to?(:devise_scope)
case obj
when String, Symbol
return obj.to_sym
when Class
Devise.mappings.each_value { |m| return m.name if obj <= m.to }
else
# patch
Devise.mappings.each_value { |m| return m.name if obj.instance_of?(m.to) }
# Devise.mappings.each_value { |m| return m.name if obj.is_a?(m.to) }
end
raise "Could not find a valid mapping for #{obj.inspect}"
end
end
Rails 4.2.5.1,Devise 3.5.6
答案 3 :(得分:0)
我遇到了与最新设计版本相同的问题。在您的路线中尝试呼叫
devise_for :admins
前
devise_for :users