代码之家  ›  专栏  ›  技术社区  ›  Trenton Tyler

Rails在窗体视图中显示引发的异常

  •  0
  • Trenton Tyler  · 技术社区  · 6 年前

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

    class invite<applicationrecord
    属于:团队
    属于:用户
    
    创建前:检查成员身份
    
    DEF支票会员
    @成员身份=self.user.teams.map t t.id
    
    如果@memberships.include?(自我,团队,ID)
    引发“该用户已加入团队”
    结束
    结束
    结束
    < /代码> 
    
    

    如果用户确实属于一个团队,并且被队长邀请,我希望有一条错误消息提醒队长他们已经在一个团队中。

    为此,我创建了一个方法来检查用户是否属于团队,如果属于团队,则引发异常。我想在视图中显示这个异常,方法是将它放入表单中。

    <%if invite.errors.any?%& gt;
    & UL & GT;
    <%test.errors.full_messages.each do_message%>
    <li><%=message%></li>
    %结束%& gt;
    </ul>
    %结束%& gt;
    

    当我向测试用户发送INVITE时,它只是在典型的Rails错误页面中显示错误消息,而不是在重新呈现的表单上方显示错误消息。如何使此异常消息在提交后显示在表单中?

    .

    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 %>
    

    当我向测试用户发送INVITE时,它只是在典型的Rails错误页面中显示错误消息,而不是在重新呈现的表单上方显示错误消息。如何使此异常消息在提交后显示在表单中?

    1 回复  |  直到 6 年前
        1
  •  3
  •   SteveTurczyn    6 年前

    您不想引发异常,只想向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 如果发生上述错误,则for invite将包含此错误。

    您确实可以通过引发异常来捕获条件,但是,根据设计,这将停止程序,除非您从异常中解救出来。你可以这么做,但这对Tihs来说太过分了。