Rails在表单视图中显示引发的异常

时间:2018-11-24 19:08:38

标签: ruby-on-rails ruby

在我的应用程序中,用户可以属于一个团队。队长可以邀请任何一个用户加入任何一个团队,只要该用户还不属于一个团队即可。我有一个邀请模型,可以在发送邀请之前检查该用户是否属于团队。

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错误页面上显示该错误消息,而不是在重新呈现时在表单上方显示错误消息。提交后如何在表单中显示此异常消息?

enter image description here

1 个答案:

答案 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将包含上述错误。

您确实可以通过引发异常来捕获条件,但是根据设计,除非您从异常中解脱出来,否则它将暂停程序。您可以这样做,但是对于这种情况来说,这太过分了。