首页 > 解决方案 > Rails - 向已经存在的用户发送邀请

问题描述

我有一个邀请方法,可以向用户发送电子邮件以成为团队的一员。我有一个模式,显示一些已经拥有帐户的用户和一个文本字段以输入更多电子邮件并发送邀请以邀请该人加入平台。但是,如果我键入数据库中已经存在的电子邮件,我会得到:

验证失败:电子邮件已被占用

但是即使该人已经有一个帐户,也想发送电子邮件。

这是我所拥有的:

  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

Candidate_ids - 这是我在列表中显示的用户(都很好) extra_emails - 文本字段中的电子邮件

因此,当我编写一个已经在文本字段中拥有帐户的用户时,team_email_invite 会尝试创建一个新用户并崩溃。

我不想做类似的事情

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

因为那样它就不会发送邀请。知道如何解决这个问题吗?

标签: ruby-on-railsruby

解决方案


你可以使用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!

推荐阅读