在我的应用程序中,用户可以属于一个团队。队长可以邀请任何一个用户加入任何一个团队,只要该用户还不属于一个团队即可。我有一个邀请模型,可以在发送邀请之前检查该用户是否属于团队。
class Invite < ApplicationRecord
belongs_to :team
belongs_to :user
before_create :check_membership
def check_membership
@memberships = self.user.teams.map { |t| t.id }
if @memberships.include?(self.team.id)
raise 'That user is already on a team'
end
end
end
如果用户确实属于团队并且受到队长的邀请,我希望有一条错误消息提醒队长他们已经在团队中。
为此,我创建了一种方法来检查用户是否属于团队,如果属于,则引发异常。我想通过将其放在表单中在视图中显示此异常。
<% if invite.errors.any? %>
<ul>
<% test.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
<% end %>
当我将邀请发送给测试用户时,它只是在典型的Rails错误页面上显示该错误消息,而不是在重新呈现时在表单上方显示错误消息。提交后如何在表单中显示此异常消息?
答案 0 :(得分:3)
您不想引发异常,只想向Invite模型添加验证。
validate :check_membership
def check_membership
return if persisted?
if user.teams.include?(team)
errors.add(:base, 'The user is already on the team')
end
end
如果发生邀请,errors
将包含上述错误。
您确实可以通过引发异常来捕获条件,但是根据设计,除非您从异常中解脱出来,否则它将暂停程序。您可以这样做,但是对于这种情况来说,这太过分了。