2012-08-09 45 views
0

这是从失败的规范的例子:Rails backtraces中附加到视图的数字是什么意思?

2) widgets/new renders new sentiment form 
    Failure/Error: render 
    ActionView::Template::Error: 
     undefined method `each' for nil:NilClass 
    # ./app/views/widgets/new.html.erb:13:in `_app_views_widgets_new_html_erb__3591031757452814763_2164570860' 
    # /Users/user/.rvm/gems/[email protected]/gems/actionpack-3.2.7/lib/action_view/template.rb:145:in `block in render' 
    # /Users/user/.rvm/gems/[email protected]/gems/activesupport-3.2.7/lib/active_support/notifications.rb:123:in `block in instrument' 
    ....... 

什么这一切意味着:_app_views_widgets_new_html_erb__ 3591031757452814763_2164570860?它是否在某处呈现临时文件?为什么这些特定数字?

回答

3

当rails呈现模板时,它首先将它们编译为真正的ruby代码。你可以在actionpack/lib/action_view/template.rb的rails源码中看到这个。

完成3个步骤。

  1. 它创建一个包含类似@output_buffer += "some_text"; @output_buffer += some_expression; ...您的ERB(或HAML,或任何你喜欢)模板Ruby代码的字符串。
  2. 它定义了一个使用eval的方法。
  3. 当该方法第一次运行时,ruby虚拟机会自动将其编译为字节码。

使用以下方案被创建包含经编译的代码的方法的名称(参见template.rb的线325):

def method_name #:nodoc: 
    @method_name ||= "_#{identifier_method_name}__#{@identifier.hash}_#{__id__}".gsub('-', "_") 
end 

所以数字实际上的@identifier的散列(其通常是模板文件的路径)和当前模板实例的对象ID。