2012-08-09 34 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。

相關問題