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がテンプレートをレンダリングするとき、最初にそれらを実際のルビーコードにコンパイルします。これは、 actionpack / lib / action_view/template.rbのrailsソースで確認できます。

これは3つのステップで行われます。

  1. @output_buffer += "some_text"; @output_buffer += some_expression; ...erb(またはhaml、またはお好みのもの)テンプレートのようなrubyコードを含む文字列を作成します。
  2. を使用してメソッドを定義しevalます。
  3. メソッドが最初に実行されるとき、rubyVMは自動的にそれをバイトコードにコンパイルします。

コンパイルされたコードを含むメソッドの名前は、以下のスキームを使用して作成されます(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 に答える