获取ActiveRecord :: StatementInvalid救援消息中的字符串

时间:2015-03-23 06:27:24

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.2 rails-activerecord

我试图将中间字符串放在rails rescue提供的标准错误消息中。

我在NuoDB数据库上创建了BEFORE INSERT触发器,它进一步验证了数据库端的记录,而不仅仅是在rails端。

此触发器的作用是比较保存记录时的两个日期。如果第一个日期晚于第二个日期,则触发器将抛出以下JDBC错误字符串:

"INPUT_ERROR - Invalid Dates: date_2 must be greater than date_1"

然后我在控制器上有以下代码来保存记录

def foo
    begin
      # save record
    rescue => e 
      flash[:notice] = e
    end
end

因此保存一个日期不正确的新记录会给出错误的闪现[:notice],就像

一样
ActiveRecord::JDBCError: INPUT_ERROR - Invalid Dates: date_2 must be greater than date_1: INSERT INTO `table` (`date_1`, `date_2`) VALUES ('2016-03-23','2015-03-23')

我想要的只是我创建的自定义文本。我想得到没有" ActiveRecord :: JDBCError的字符串:"开头的字符串和结尾的SQL语句。

那么如何获取文本以便我的flash [:notice]只输出:

 "INPUT_ERROR - Invalid Dates: date_2 must be greater than date_1"

2 个答案:

答案 0 :(得分:1)

使用e.message代替eit will strip exception's class name.

答案 1 :(得分:0)

要执行您想要的操作,您需要自己解析字符串或更改ActiveRecord遇到异常时生成的错误消息。
后者要求您通过“log”方法(< 4.2.1)或“translate_exception_class”方法(> = 4.2.1)更改“ActiveRecord :: ConnectionAdapters :: AbstractAdapter”类的行为猴子补丁什么的。示例:

https://gist.github.com/timraasveld/6c28bcc8b905818a98b349fe0eb73c5f

该方法的当前实现将原始异常类名称添加到它抛出的新包装异常的消息中(除非您使用的子类适配器本身覆盖此行为)