另外,erb 并不是通过 eval 执行的。Rails 现在用 Erubis 来处理 erb, eruby 生成的 ruby 代码会 compile 成一个 ruby method 再执行,相关代码见: https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/template.rb#L265, https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/template/handlers/erb.rb#L69)
require 'erubis'
input = <<'END'
<ul>
<% for item in @list %>
<li><%= item %></li>
<% end %>
</ul>
END
list = ['<aaa>', 'b&b', '"ccc"']
eruby = Erubis::Eruby.new(input)
puts eruby.src
# result:
_buf = ''; _buf << ' <ul>
'; for item in @list
_buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
'; end
_buf << ' </ul>
';
_buf.to_s
@xdite, 你是在 rails 代码里看到 activerecord 在不同环境下有不同的缓存策略吗? model 上对 association 的缓存跟代码运行的环境应该无关啊,association 是保存在 record 的实例方法上的,在 view 里 post.user 十次不会执行十次查询 (除非 user 不是用 association 定义的). 见 ActiveRecord::Associations::Builder::Association
unicorn 现在是主流了,github 在 09 年就开始在用:https://github.com/blog/517-unicorn
@hooopo, 在 config.ru 里加了几行记录时间 $ cat config.ru
app_start_init_time = Time.now
require ::File.expand_path('../config/environment', FILE)
app_init_finish_time = Time.now if Rails.env.development? puts "=> boot app used #{app_init_finish_time - app_start_init_time} seconds" end
run RubyChina::Application