在Rails中追加视图的数字是什么意思?

时间:2012-08-09 21:08:32

标签: ruby-on-rails

以下是失败规范的示例:

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

1 个答案:

答案 0 :(得分:3)

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

这是完成3个步骤。

  1. 它会为你的erb(或haml,或任何你喜欢的)模板创建一个包含像@output_buffer += "some_text"; @output_buffer += some_expression; ...这样的红宝石代码的字符串。
  2. 使用eval定义方法。
  3. 第一次运行该方法时,ruby VM会自动将其编译为字节码。
  4. 使用以下方案创建包含已编译代码的方法的名称(参见template.rb的第325行):

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

    因此,数字实际上是@identifier(通常是模板文件的路径)的哈希值和当前模板实例的对象ID。