我有一个邀请方法,可以向用户发送电子邮件以成为团队的一部分。我有一个模式,显示一些已经有帐户和文本字段的用户,以输入更多电子邮件,并发送邀请该人加入该平台。 但是,如果我键入数据库中已经存在的电子邮件,则会得到:
验证失败:电子邮件已被接收
但是即使该人已经有一个帐户,也要发送电子邮件。
这就是我所拥有的:
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
因为它不发送邀请。 任何想法如何解决这个问题?
答案 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!