2015-08-21 69 views
0

我正在尝试创建自己的StandardError异常,但似乎无法通过提升来解除rescue_from。错误提出,但从未获救。我建了一个简单的应用程序来试试吧,如下:为什么这个提升没有解救,什么会纠正它,以便它?

class ApplicationController < ActionController::Base 

    protect_from_forgery with: :exception 

    class ApplicationController::LocationInvalid < StandardError 
    end 

    rescue_from ApplicationController::LocationInvalid, with: :reset_it 

    raise ApplicationController::LocationInvalid 

    private 

    def reset_it(exception) 
    session.clear 
    cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery? 
    puts 'Reset it processed' 
    end 
end 

当我包裹筹集开始/救援/结束,它打印ē作为的ApplicationController :: LocationInvalid:

begin 
    raise ApplicationController::LocationInvalid 
    rescue => e 
    puts e 
    end 

输出:

入门使用 “/” 为127.0.0.1,在2015年8月21日15时19分32秒-0400 的ApplicationController :: LocationInvalid

仅在process_action呼叫我已经试过各种形式指定的ApplicationController类,而不是在结果没有改变的......

+0

尝试'提升ApplicationController :: LocationInvalid.new'。 – CWitty

+0

@CWitty谢谢你的建议。看起来很合理。但结果基本相同。我看到一个提示:“你可以提出任何事情”,看起来你可以提出一个课程或一个实例。 Rescue_from似乎并没有分享那种随便的态度...... –

+0

我不知道在评估课程的时候你是否引发了异常,而且对于'reset_it'的def还没有被评估呢?尝试在方法中放置'raise',然后从控制台或其他东西调用该方法。像Daiku说的 – Daiku

回答

1

根据Rails的https://github.com/rails/rails/blob/f62fb985b6a7b90872148f0786219c9cc94c9356/actionpack/lib/action_controller/metal/rescue.rb#L32

rescue_with作品的源代码,但你正在募集课堂评估中的例外。如何测试它最简单的方法可能是创建一个简单的控制器并采取一些行动,并在该行动期间尝试引发异常,并且rescue_with应该可以工作。

+0

非常好。我使用after_action来执行抛出错误和rescue_from的方法。这有助于我理解我的其他问题,例如为什么请求仅在一种方法中可用。似乎是相同的原因。谢谢... –