Rails-向已经存在的用户发送邀请

时间:2018-12-18 23:16:16

标签: ruby-on-rails ruby

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

  

验证失败:电子邮件已被接收

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

这就是我所拥有的:

  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

因为它不发送邀请。 任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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