以下是失败规范的示例:
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/ruby-1.9.3-p194@myapp/gems/actionpack-3.2.7/lib/action_view/template.rb:145:in `block in render'
# /Users/user/.rvm/gems/ruby-1.9.3-p194@myapp/gems/activesupport-3.2.7/lib/active_support/notifications.rb:123:in `block in instrument'
.......
这意味着什么:_app_views_widgets_new_html_erb __ 3591031757452814763_2164570860 ?它在某处呈现临时文件吗?为什么这些特定的数字?
答案 0 :(得分:3)
当rails渲染模板时,它首先将它们编译为真正的ruby代码。您可以在actionpack/lib/action_view/template.rb中的rails源中看到这一点。
这是完成3个步骤。
@output_buffer += "some_text"; @output_buffer += some_expression; ...
这样的红宝石代码的字符串。eval
定义方法。使用以下方案创建包含已编译代码的方法的名称(参见template.rb的第325行):
def method_name #:nodoc:
@method_name ||= "_#{identifier_method_name}__#{@identifier.hash}_#{__id__}".gsub('-', "_")
end
因此,数字实际上是@identifier
(通常是模板文件的路径)的哈希值和当前模板实例的对象ID。