【问题标题】:Custom mailer for other than admin and user in Devise RailsDevise Rails 中除管理员和用户之外的自定义邮件程序
【发布时间】:2016-08-31 06:53:07
【问题描述】:

我有一个关于 Devise 的问题。我在设计 Rails 中创建了除管理员和用户之外的新角色。这是 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 发送默认邮件。当然,我对版主邮件有意见,以及发送它的方法。

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 谢谢 :) 它比我的解决方案更透明。
    【解决方案2】:

    我为用户创建了装饰器:

     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
    

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

    【讨论】:

      猜你喜欢
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      相关资源
      最近更新 更多