设计不使用自定义邮件程序视图

时间:2015-08-21 14:13:16

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

我正在使用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'

知道什么是错的吗?

4 个答案:

答案 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