Переопределить почтовик в devise_invitable? - PullRequest
5 голосов
/ 20 июня 2011

Я хотел бы, чтобы приглашения для моего приложения приходили от приглашающего, а не от системного адреса электронной почты. Как я могу переопределить config.mailer_sender из devise.rb?

У меня есть это в моей почтовой программе, и я подтвердил, что он вызывается, но он не отменяет :from. Примечание: это частный метод, я пробовал его как открытый метод без эффекта.

private

def headers_for(action)
  if action == :invitation_instructions
    headers = {
      :subject       => "#{resource.invited_by.full_name} has invited you to join iTourSmart",
      :from          => resource.invited_by.email,
      :to            => resource.email,
      :template_path => template_paths
    }
  else
    headers = {
      :from          => mailer_sender(devise_mapping),
      :to            => resource.email,
      :template_path => template_paths
    }
  end

  if resource.respond_to?(:headers_for)
    headers.merge!(resource.headers_for(action))
  end

  unless headers.key?(:reply_to)
    headers[:reply_to] = headers[:from]
  end

  headers
end

Ответы [ 3 ]

5 голосов
/ 22 марта 2012

Лучшее решение без каких-либо взломов / патчей обезьяны будет: например, в вашей модели:

def invite_and_notificate_member user_email
  member = User.invite!({ email: user_email }, self.account_user) do |u|
    u.skip_invitation = true
  end
  notificate_by_invitation!(member)
end

def notificate_by_invitation! member
  UserMailer.invited_user_instructions(member, self.account_user, self.name).deliver
end

В почтовой программе:

  def invited_user_instructions(user, current_user, sa)
    @user = user
    @current_user = current_user
    @sa = sa
    mail(to: user.email, subject: "#{current_user.name} (#{current_user.email}) has invited you to the #{sa} account ")
  end

Таким образом, вы можете поставить любой предмет/ данные в теле письма.

Удачи!

4 голосов
/ 21 июня 2011

Посмотрите на мой ответ на похожий вопрос, это может помочь.

Редактировать: , поэтому кажется, что вам необходимо определить публичный метод headers_for в вашем классе ресурсов.

Решение: Поместите некоторую версию этого метода в User.rb,убедитесь, что он публичный.

def headers_for(action)
  action_string = action.to_s
  case action_string
  when "invitation" || "invitation_instructions"
    {:from => 'foo@bar.com'}
  else
    {}
  end
end

Вы должны вернуть хеш, потому что Devise::Mailer попытается объединить значения хеша.

3 голосов
/ 15 августа 2013

Взгляните на devise_invitable wiki .

class User < ActiveRecord::Base
  #... regular implementation ...

  # This method is called interally during the Devise invitation process. We are
  # using it to allow for a custom email subject. These options get merged into the
  # internal devise_invitable options. Tread Carefully.
  #
 def headers_for(action)
    return {} unless invited_by && action == :invitation_instructions
    { subject: "#{invited_by.full_name} has given you access to their account" }
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...