ruby-on-rails - Rails 中 View 的解析过程

标签 ruby-on-rails ruby

rails 中 View 的解析过程是怎样的?我对 View 中 erb 标记中原始 html 与 ruby​​ 代码的解析顺序 部分感兴趣。

我认为这是 View 代码被解析并最终发送给请求者的顺序:

  • Controller 调用 View
  • View 代码从上到下解析
    • 当 Rails 在解析过程中 遇到 erb 标记时:rails 解析它并将结果附加到解析的 html(这包括 erb标签引用助手)
  • 一旦整个 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 标签本身是否有解析命令?例如:也许引用 helpererb 标记在遍历集合的 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/

相关文章:

ruby-on-rails - 在关系中加载整数属性总是以 '0' 的形式出现

mysql - 事件记录。包括来自连接表的数据

javascript - rails : save Google chart on server side

ruby-on-rails - 正在运行的规范条目正在从模式迁移表中删除

ruby-on-rails - 将 Rails 应用程序分发为 native 应用程序

ruby-on-rails - rails friendly_id 并检查条目是否存在

ruby-on-rails - 如何动态更改 Ruby on Rails 中所有模型的 Active Record 数据库?

ruby - 调用实例变量时可以省略@吗

ruby-on-rails - Ruby:为什么实例评估类创建实例方法而不是类方法

ruby - OpenSSL 命令行和 Ruby OpenSSL 库在使用相同参数加密文本时有所不同