Rails为同一个动作设置了不同的Devise Mailer布局

时间:2016-06-12 22:24:55

标签: layout devise actionmailer ruby-on-rails-5

我有一个模型用户,它有多个引用的“个人资料”。用户可以拥有其中的几个配置文件,每个配置文件都应该在电子邮件中引入特定的布局。我们考虑一下个人资料AdminWorker

例如,在我的Devise确认控制器中,我需要不同的布局,具体取决于用户的配置文件。例如,如果用户有

  • 管理员资料:渲染管理模板
  • 工人资料:渲染工人模板
  • 两者:渲染另一个模板(混合)

因此我无法为Mailer / Controller设置布局,但我需要在控制器操作中设置它。假设我有一个帮助程序layout_for_user(),它可以返回给定用户的布局名称。我该如何使用它?例如使用Devise邮件程序?

class MyDeviseMailer < Devise::Mailer
    def confirmation_instructions(record, token, options={})
      # whange layout based on `layout_for_user(record)`
      @token = token
      devise_mail(record, :confirmation_instructions, opts)
    end
end

1 个答案:

答案 0 :(得分:2)

我必须覆盖devise_mail方法

def confirmation_instructions
  ...
  @layout = find_layout_for_user(user)
  devise_mail(user, :confirmation_instructions, opts)
end

# Override to include custom layouts
def devise_mail(record, action, opts={})
  initialize_from_record(record)
  mail(headers_for(action, opts)) do |format|
    format.html { render layout: @layout }
  end
end