ruby-on-rails - 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
因为那样它就不会发送邀请。知道如何解决这个问题吗?
解决方案
你可以使用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!
推荐阅读
- wordpress - 只显示给定单词的简码一次
- php - 在中间件中获取 laravel 路由 {slug}
- python - 在有向无环图 Python 中面临句法问题
- sql - 在 Oracle 中依靠 UNION
- html - 使标签的整个宽度可点击和响应
- performance - 如何通过 jenkins - jmeter webdriver 脚本管理 Web 驱动程序?
- python - 根据 SPARQL 查询和 Pagerank 值突出显示 draw_networkx 可视化中的节点
- anylogic - 是否有任何内置函数可以在anylogic中获取某个直径范围内的节点(点节点)列表?
- javascript - HTML5 Canvas 笔画文本重叠加入阿拉伯语、印地语、孟加拉语等语言的部分
- reactjs - 如何在 React 中处理表格中的滚动条事件