Devise Rails中除管理员和用户之外的自定义邮件程序

时间:2016-08-31 06:53:07

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

我有一个问题,与Devise。我在设计Rails中创建了除admin和user之外的新角色。这是它在user.rb模型中的样子

class User < ActiveRecord::Base
    PANEL_LEVELS = [PANEL_LEVEL_NORMAL = 'normal', PANEL_LEVEL_INACTIVE_MODERATOR = 'inactive_moderator', PANEL_LEVEL_DESIGNER = 'moderator']

当某人创建新版主帐户时,它将成为非活动版主。

对我来说,主要问题是向主持人发送自定义确认邮件,这是我尝试从custom_devise_mailer中执行此操作的方式:

 def confirmation_instructions(record, token, opts = {})
if record.class.name == 'User'
  opts[:template_path] = 'devise_users/mailer'
else if resource.panel_level == User::PANEL_LEVEL_INACTIVE_MODERATOR
       opts[:template_path] = 'devise_moderators/mailer'
     else
       opts[:template_path] = 'devise_admins/mailer'
     end
end
opts[:template_name] = :confirmation_instructions
super


end

哪里

      resource.panel_level = User::PANEL_LEVEL_INACTIVE_MODERATOR if params.fetch('account') { nil } == 'moderator'

但它正在为devise_user发送默认邮件。当然,我有关于主持人邮件的观点,以及发送它的方法。

2 个答案:

答案 0 :(得分:1)

你的if语句非常扭曲。 您可以通过将一些逻辑抽象为装饰器来简化它们,从而提高可读性。 我猜你有Admin和User类的装饰器:

# in UserDecorator
def devise_mailer
  if object.panel_level = User::PANEL_LEVEL_INACTIVE_MODERATOR
    'devise_moderators/mailer'
  else
    'devise_users/mailer'
  end
end

# in AdminDecorator
def devise_mailer
  'devise_admins/mailer'
end

custom_devise_mailer.rb简化为:

def confirmation_instructions(record, token, opts = {})
  opts[:template_path] = resource.decorate.devise_mailer
  super
end

答案 1 :(得分:0)

我为用户创建了装饰器:

 def inactive_designer
User::PANEL_LEVEL_INACTIVE_MODERATOR
end

使用上面的代码,我只能使用inactive_moderator而不是输入User :: PANEL_LEVEL_INACTIVE_MODERATOR

在custom_devise_mailer.rb

  def confirmation_instructions(record, token, opts = {})
if record.class.name == 'User' && record.panel_level != record.decorate.inactive_moderator
  opts[:template_path] = 'devise_users/mailer'
else if record.class.name == 'Admin'
       opts[:template_path] = 'devise_admins/mailer'
     else if record.decorate.inactive_moderator == record.panel_level && record.class.name != 'Admin'
            opts[:template_path] = 'devise_moderators/mailer'
          end
     end
end

使用装饰器并制作一些条件,以区分角色。