我有一个问题,与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发送默认邮件。当然,我有关于主持人邮件的观点,以及发送它的方法。
答案 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
使用装饰器并制作一些条件,以区分角色。