0

以下是失败规范的示例:

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?它是否在某处呈现临时文件?为什么会有这些特定的数字?

4

1 回答 1

3

当 rails 渲染你的模板时,它首先将它们编译成真正的 ruby​​ 代码。您可以在actionpack/lib/action_view/template.rb的 rails 源代码中看到这一点。

这是通过 3 个步骤完成的。

  1. 它会创建一个包含 ruby​​ 代码的字符串,例如@output_buffer += "some_text"; @output_buffer += some_expression; ...您的 erb(或 haml,或任何您喜欢的)模板。
  2. 它定义了一个使用eval.
  3. 第一次运行该方法时,ruby VM 会自动将其编译为字节码。

包含已编译代码的方法的名称是使用以下方案创建的(参见 template.rb 的第 325 行):

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

所以这些数字实际上是@identifier(通常是模板文件的路径)和当前模板实例的对象 id 的哈希值。

于 2012-08-09T21:51:35.200 回答