2016-08-31 14 views
1

Deviseに問題があります。私はdevise Railsでadminとuser以外の新しい役割を作った。ここではuser.rbモデルのように見えますDevise Railsのadminとuser以外のカスタムメーラ

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。当然のことながら、私は司会者メーラーとそれを送信する方法についての意見を持っています。

答えて

1

if文が非常にねじれています。 いくつかのロジックをデコレータに抽象化することで、読みやすさを向上させることができます。 は、私はあなたが管理者とユーザのクラスのデコレータを持っていることをgues:あなたのcustom_devise_mailer.rbのように簡略化することができることを持つ

# 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 

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

は、あなたはそれが私よりもっと透明性ソリューションです:)ありがとうございました。 – Pigius

0

私は、ユーザーのためのデコレータ作成:、私は、ユーザーが入力する代わりにinactive_moderator使用することができますに上記のコードでは

def inactive_designer 
User::PANEL_LEVEL_INACTIVE_MODERATOR 
end 

を:: 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 

使用デコレータといくつかの条件付きで、役割を区別する。