2012-01-12 79 views
4

我處理RecordNotFound錯誤在我application_controller.rb如下:從獲得的ActiveRecord :: RecordNotFound在Rails的額外信息

rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found 

    private 

    def record_not_found 
    flash[:error] = "Oops, we cannot find this record" 
    redirect_to :back 
    end 

但我想獲得更多的信息,例如類/表名,其中記錄是不找到。 我該怎麼處理?

謝謝。

+1

事實上,很遺憾'ActiveRecord :: RecordNotFound'實例攜帶零信息('class RecordNotFound tokland 2013-01-10 11:14:43

回答

2

比方說,

begin 
@user = User.find(params[:id]) 
rescue ActiveRecord::RecordNotFound 
    flash[:notice] = "#No such record in User for id :: {params[:id]} on #{action_name}" 
end 

UPDATE

flash[:notice] = t('flash.recordnotfound',:class_name => self.class.name, :column_name => params[:id], :action_name => action_name) 

現在,在您config/locales/en.yml(這將幫助翻譯,請參閱國際化here

flash: 
    recordnotfound: "Sorry, no record od %{column_name} in class %{class_name} was found on you action %{action_name}" 

如果您不想使用語言環境,只需在flash[:notice]本身提供此信息。

更有活力?

寫一個函數,並在那裏使用相同的flash [:notice]。根本不會傷害。

想要更多的數據?

繼承人一個快速的解決方案,我總是<%= params%>在我的意見很容易知道什麼是什麼和什麼來臨。然後,您可以打開您的滑軌控制檯並隨着不同的操作一起玩。

user = User.new 
user.save 
user.errors.messages 

所有這些都是足夠好的數據,我想。

祝你好運。

+1

謝謝ktk。這很好,但是有沒有辦法將其推廣到任何課程? – AdamNYC 2012-01-12 02:31:13

+0

非常感謝你這麼棒的回答!該提示也非常有幫助。 – AdamNYC 2012-01-12 02:55:34

3

您可以在您的救援處理程序中定義一個參數,並將異常傳遞到那裏。

def record_not_found exception 
    flash[:error] = "Oops, we cannot find this record" 
    # extract info from exception 

    redirect_to :back 
end 

如果您無法從異常中獲取該信息,那麼您運氣不佳(我認爲)。

+0

謝謝,塞爾吉奧。你能給我一個從異常中提取信息的例子嗎? – AdamNYC 2012-01-12 02:21:33

+0

@AdamNYC:畢竟,你好像[運氣不好](http://api.rubyonrails.org/classes/ActiveRecord/RecordNotFound.html)。 :-) – 2012-01-12 02:23:43

+0

是的,我檢查之前,我問:) – AdamNYC 2012-01-12 02:27:42

0

一旦你實例化模型,你可以檢查類似的東西。

human = Human.new 
human.errors 

在rails控制檯中檢查此選項,以便您可以使用它並在主控制器中使用它。

rescue_from ActiveRecord::RecordNotFound do |exception| 
    raise ActiveRecord, exception.message, exception.backtrace 
end 

編輯 確保您的應用控制器擴展基礎。

class ApplicationController < ActionController::Base 
rescue_from Exception, :with => :record_not_found 
    private 

    def record_not_found(e) 
    flash[:error] = "Oops, we cannot find this record" + e.message 
    redirect_to :back 
    end 
end 
+0

謝謝克萊爾。我收到一個錯誤消息:異常類/對象預期。 – AdamNYC 2012-01-12 02:34:44

2

我取得了一些成功的:

# in app/controllers/application_controller.rb 

rescue_from ActiveRecord::RecordNotFound, with: :record_not_found 

def record_not_found exception 
    result = exception.message.match /Couldn't find ([\w]+) with 'id'=([\d]+)/ 
    # result[1] gives the name of the model 
    # result[2] gives the primary key ID of the object that was not found 
end 

HTH

編輯:空白錯誤的正則表達式的末尾刪除。感謝評論者。 :)

+0

這不起作用。 ''找不到'id'= 1的事件類型'.match(/無法找到([\ w] +)'id'=([\ d] +)/'不會返回任何內容 – Sebastialonso 2016-07-08 22:36:44

+1

您需要在結尾刪除空白:'..with'id'=([\ d] +)[this whitespace] /' – Sebastialonso 2016-07-08 23:05:04

相關問題