7.1.3.4. Rails breakpoints


断点是调试中一个很重要的方式,使用断点可以暂停正在执行的动作,检查甚至是修改其中的变量,然后恢复执行。绝对是调试工作的利器!下面来看看怎么使用断点。

假定,我们正在开发的应用中,有一个message资源,它被show这个action的模板调用。在浏览器中载入show这个模板,很不幸, rails抛出了一个异常:

NoMethodError in Messages#show
undefined method 'title' for #<Message:0x4fd16c8>

也不知道为什么会出错,我们决定使用断点来寻找问题的原因。切换到controller中,在show方法中加入断点命令:
def show
    @post = Message.find params[:id]
    breakpoint
end

保存之后,切回到浏览器,刷新一下。浏览器开始加载页面,但是不会结束。当rails遇到断点声明的时候,停止执行action并且允许你在show方法中输入控制台会话。新建一个控制台,使用script/breakpointer命令进入断点,就像使用script/console命令一样。结果应该是这样:

$ script/breakpointer
Executing break point at script/../config/../app/controllers/messages_controller.rb:20 in 'show'
irb(#<MessagesController:0x4f2d0f0>):001:0>
上面给出的提示信息告诉你,断点所处的位置。使用instance_variables方法返回一个在目前环境中可用的实例变量组成的数组:
irb(#<MessagesController:0x2485730>):004:0> instance_variables
=> ["@post", "@headers", "@performed_redirect", "@flash", "@request",    
"@_    _bp_file", "@assigns", "@action_name", "@params", "@current_user",    
"@session", "@template", "@cookies", "@_    _bp_line", "@request_origin",    
"@performed_render", "@variables_added", "@response", "@url", "@before_filter_chain_aborted"]
当然,你也可以通过其他的方法来得到一些在目前环境下可用的内容,譬如params:
irb(#<MessagesController:0x4f2d0f0>):001:0> params
=> {"action"=>"show", "id"=>"7", "controller"=>"messages"}
因为断点是在实例变量@post被定义之后被调用的,所以你可以检查一下@post的内容:
irb(#<MessagesController:0x4f2d0f0>):002:0> @post
=> #<Message:0x4f0bcc0 @attributes={"name"=>"Untitled Message",    
"body"=>"",    "id"=>"7", "created_at"=>"2006-07-06 21:02:48"}>
而且,为了更清晰的看到引发错误的原因,可以进一步查看@post对应的模型类有那些属性:
irb(#<MessagesController:0x4f2d0f0>):003:0> @post.attributes.keys
=> ["name", "body", "id", "created_at"]

断点也可以在试图中使用:只要将<% breakpoint %>添加视图模板文件的需要位置即可。

当你调试检查出错误所在之处,并且修正了之后,在使用断点会话的控制台中输入exit命令,action会继续从断点往下执行,并且会给浏览器发送响应。

7.1.4. Inspectors
调试的核心目标是清晰化:看到系统中对象的隐藏属性。到目前为止,我们已经介绍了两种可以实现这个目标的手段,日志和控制台。现在我们来看看第三种工具,监测器。一些监测器是rails内建的,也有第三方的rails插件,还有加载到客户端浏览器的。所有的这些都应该在rails开发者的工具箱中。

你可能感兴趣的:(Ajax,职场,on,Rails,休闲)