Rails - отправка приглашений пользователям, которые уже существуют - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть метод приглашения, который отправляет электронные письма пользователей для участия в команде.У меня есть модал, который отображает некоторых пользователей, которые уже имеют учетную запись и текстовое поле для ввода большего количества электронных писем, и отправляет приглашение человеку присоединиться к платформе.Но если я наберу электронное письмо, которое уже существует в базе данных, я получу:

Проверка не удалась: электронная почта уже получена

Но я хочу отправить электронное письмо, даже еслиУ человека уже есть аккаунт.

Вот что у меня есть:

  def invite
    invite = params.dig(:invite) || {}
    candidate_ids = invite.dig(:candidate_ids) || []
    extra_emails = invite.dig(:extra_emails) || ""
    emails = extra_emails
      .split(/,|;/)
      .map(&:strip)

    new_users = emails.map { |email| team_email_invite(email) }

    candidate_ids.concat new_users.map(&:id)

    invite_data = candidate_ids.map { |uid| {
      :user_id => uid,
      :team_id => @team.id,
    } }

    TeamInvite.create(invite_data)
      .map!(&:email)

    respond_to do |format|
      format.html { redirect_to overviews_url, notice: 'Invites sent.' }
      format.json { head :no_content }
    end
  end

  def team_email_invite(email)
    user = User.new({
      :email => email,
      :password => SecureRandom.hex,
      :role => :shadow,
    })
    user.add_role :recruiter
    user.skip_confirmation_notification!
    user.save!
  end

еще_для - это пользователи, которых я отображаю в списке (все хорошо) extra_emails - электронные письма в текстовом поле

Поэтому, когда я пишу пользователю, у которого уже есть учетная запись в текстовом поле, team_email_invite пытается создать нового пользователя и вылетает.

Я не хочу делать что-то вроде

begin
  new_users = emails.map { |email| team_email_invite(email) }
rescue
  new_users=[]
end

потому что тогда он не отправляет приглашение.Есть идеи, как это решить?

1 Ответ

0 голосов
/ 19 декабря 2018

Вы можете использовать first_or_initialize.Блок запускается только в том случае, если User еще не существует.Вот пример ...

user = User.where(email: email).first_or_initialize do |usr|
  usr.email = email
  usr.password = SecureRandom.hex
  usr.role = :shadow
  usr.skip_confirmation_notification!
end

user.add_role :recruiter
user.save!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...