Rails разный макет Devise Mailer для одного и того же действия

У меня есть модель User с несколькими ссылками на «профили». У пользователя может быть несколько таких профилей, и каждый из этих профилей должен вызывать определенный макет в электронных письмах. Рассмотрим профили Admin и Worker

Например, в моем контроллере подтверждения 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

person Cyril Duchon-Doris    schedule 12.06.2016    source источник


Ответы (1)


Мне пришлось переопределить метод 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
person Cyril Duchon-Doris    schedule 05.04.2017