Rails - 从模型中获取非验证错误的错误消息

时间:2009-11-08 03:13:02

标签: ruby-on-rails error-handling

所以我在一个名为add_equip的预留模型中有一个方法。此方法会进行一些检查以确保添加的设备有效(不与其他预留冲突)。

检查有效。如果不添加添加的设备,则不应添加,如果应该添加。

问题是我无法弄清楚如何将消息发送回控制器以放入flash消息中?我知道我必须在这里遗漏一些东西,但我现在用Google搜索了几个小时,并且无法找到任何明确的解释如何将错误传回控制器,除非它们是验证错误。

在reservations_controller中加上add_equip

    def add_equip
    @reservation = Reservation.find(params[:id])
    @addedEquip = Equip.find(params[:equip_id])

    respond_to do |format|
     if @reservation.add_equip(@addedEquip)
        flash[:notice] = "Equipment was added"
        format.html { redirect_to(edit_reservation_path(@reservation)) }
     else
        flash[:notice] = @reservation.errors
        format.html { redirect_to(edit_reservation_path(@reservation)) }
     end
    end
  end

预订模式中的add_equip

def add_equip equip
   if self.reserved.find_by_equip_id(equip.id)
     self.errors.add_to_base("Equipment Already Added")
     return false
   elsif !equip.is_available?(self.start, self.end)
     self.errors.add_to_base("Equipment Already Reserved")
     return false
   else
     r = Reserved.new
     r.reservation = self
     r.equip = equip
     r.save
   end
  end

非常感谢任何帮助。我知道我在这里缺少一些基本的东西。

2 个答案:

答案 0 :(得分:25)

使用add_to_base存储错误消息对我来说似乎很好,你只需要弄清楚如何将它放入视图中。

怎么样:

flash[:notice] = @reservation.errors.full_messages.to_sentence

假设您要重新显示表单,您也可以使用:

<%= f.error_messages %>

或者可能:

<%= error_messages_for :reservation %>

此外,您可能希望使用flash [:error],然后您可以使用视图中的CSS类对其进行不同的着色。

答案 1 :(得分:1)

我想我可以看到为什么错误没有传回给用户。

问题是,当操作失败而不是仅仅执行渲染时,您将向用户发送重定向,这意味着您将丢失设置为在请求中使用的任何变量。而不是向闪存添加错误,只需渲染编辑页面并将闪存设置为正常消息,一切都应该没问题。

例如:

def add_equip
  @reservation = Reservation.find(params[:id])
  @addedEquip = Equip.find(params[:equip_id])

  respond_to do |format|
    if @reservation.add_equip(@addedEquip)
      flash[:notice] = "Equipment was added"
      format.html { redirect_to(edit_reservation_path(@reservation)) }
    else
      flash[:error] = 'Error adding equipment'
      format.html { render :action => :edit }
    end
  end
end

现在,您可以继续使用普通表单帮助程序来显示错误消息。

另外,只是对型号代码提出一点建议,尽可能使用i18n(包括控制器中的闪存消息)。虽然这主要是个人偏好,但它为您的所有消息和特定文本提供了逻辑主页,并且alos允许您创建一般或默认消息,这些消息可以在一个地方更改,而不是在多个模型和控制器中复制更改。 / p>

例如

def add_equip equip
  if self.reserved.find_by_equip_id(equip.id)
    self.errors.add_to_base(:already_added)
    return false
  elsif !equip.is_available?(self.start, self.end)
    self.errors.add_to_base(:already_reserved)
    return false
  else
    r = Reserved.new
    r.reservation = self
    r.equip = equip
    r.save
  end
end