rails 中 View 的解析过程是怎样的?我对 View 中 erb
标记中原始 html 与 ruby 代码的解析顺序 部分感兴趣。
我认为这是 View 代码被解析并最终发送给请求者的顺序:
- Controller 调用 View
- View 代码从上到下解析
- 当 Rails 在解析过程中 遇到
erb
标记时:rails 解析它并将结果附加到解析的 html(这包括erb
标签引用助手)
- 当 Rails 在解析过程中 遇到
- 一旦整个 View 被解析,整体结果将发送给请求者
这似乎并非如此。看来 View 代码会扫描任何 erb
片段并首先 解析那些片段(包括对助手的引用)。 之后,rails 然后从上到下解析所有 View 代码并将结果发送给请求者。
以这个 View 为例:
# _form.html.erb
<p> Hello World </p>
<p> Foobar </p>
<% if something_is_true %>
<%= some_helper_method_that_returns_html %>
<% end %>
这是 Rails 计算 View 并将结果发送给请求者的正确顺序吗?
- Rails 扫描 Controller 调用的 View :以及此 View 引用的任何 View 部分,以查看是否有任何
erb
片段- 对于所有
erb
片段,这些片段被解析/转换为 html 并附加到 html View
- 对于所有
- 然后 Rails 从上到下解析 View (此时, View 是自身加上任何引用的部分,以及之前
erb
的所有 html 的集合
- View 完全解析后:Rails 将结果发送给请求者
跟进问题:erb
标签本身是否有解析命令?例如:也许引用 helper
的 erb
标记在遍历集合的 erb
标记之前首先被解析?或者:Rails 总是从上到下解析 erb
标签吗?
最佳答案
您认为 View 代码将从上到下读取并以这种方式处理是正确的。但是这种方法有一个问题。 ERB 是一个模板引擎/库,要使模板引擎快速,它必须智能地工作。
渲染 Action 的过程是这样的:
- 请求被传递给 Controller
- 过滤器运行前后
- 运行指定的操作,现在 Rails 知道要呈现哪个文件
- ERB 代码是从 ERB 文件中挑选出来的,忽略了所有的 HTML,因为 Rails 不知道如何处理它
ERB 代码以有序的方式处理。例如:
<%= render 'my_header' %> This is some HTML <%= render 'my_footer' %>
在这种情况下,文件
_my_header.html.erb
将首先处理和注入(inject),然后_my_footer.html.erb
将被处理和注入(inject)。 ERB 标签从上到下解析。- 整个文件被注入(inject)到布局文件中代替
<%= yield %>
- 过滤器运行后且周围过滤器关闭
- 数据发送给客户端
我希望这能解决您关于 ERB 图书馆的所有问题。
关于ruby-on-rails - Rails 中 View 的解析过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38511314/