独立于 Rails 在 HAML 文件中使用布局

2024-04-15

我的最终目标是创建几个静态 HTML 文件以交给其他人。

但对于我的工作流程,我希望将 HAML 作为基本源文件。在这样做时,我希望至少在我这边能够干燥这个过程。

现在我有很多页面最终将共享一个通用布局,我想知道如何合并这些布局。

这是我当前的代码:

./编译.rb

#!/usr/bin/env ruby

require 'rubygems'
require 'rake'
require 'haml'

FileList.new('./src/*.html.haml').each do |filename|
  if filename =~ /([^\/]+)\.haml$/
    File.open($1, 'w') do |f|
      f.write Haml::Engine.new(File.read(filename)).render
    end
  end
end

./src/layout.html.haml

!!!
%html
  %head
    %title Yay
  %body
    = yield

./src/home.html.haml

= render :layout => 'header' do
  %p This is awesome

现在这显然不起作用,因为渲染方法在 Rails 上下文中未定义,但我希望它能明白我想要做的事情。

有什么建议么?


您混淆了两个不同的 Rails 功能:部分(使用render) http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials and 布局(使用yield) http://guides.rubyonrails.org/layouts_and_rendering.html#understanding-yield.

您可以将其中一个(或两个)的类似 Rails 的版本添加到仅限 Haml 的程序中。

Partials

在 Rails 视图中,您可以使用render :partial_name导致文件_partial_name.html.haml在包含视图中的该点进行渲染(实际上 Rails 允许您使用支持的任何模板语言,并且它会找到要使用的正确文件扩展名,但我将在这里坚持使用 Haml)。铁轨外render不可用,但可以相当容易地添加。

一个简单的render方法只会找到适当的 haml 文件,渲染它,并返回 html 字符串以包含在父级中:

def render(partial)
  # assuming we want to keep the rails practice of prefixing file names
  # of partials with "_"
  Haml::Engine.new(File.read("_#{partial}.html.haml")).render
end

第一个参数Haml::Engine.render是一个作用域对象,我们可以使用它来添加 haml 模板中可用的方法。它默认为Object.new。然而,在像这样的简单情况下,我们可以定义render方法位于顶层,并且它将在 Haml 模板的范围内可用。我们简单地把我们的render调用之前脚本中的方法Haml::Engine.new(...).render,并在我们的模板中这样称呼它:

!!!
%html
  %head
    %title Hello
  %body
    =render :the_partial

现在文件_the_partial.html.haml将在输出的适当位置呈现渲染。

局部变量

我们可以更进一步。 Rails 允许你传递一个哈希值局部变量 http://guides.rubyonrails.org/layouts_and_rendering.html#passing-local-variables到部分。 Haml 还将接受作为局部变量传递的变量哈希,作为 Haml 的第二个参数render方法。因此,如果我们将渲染方法扩展为:

def render(partial, locals = {})
  Haml::Engine.new(File.read("_#{partial}.html.haml")).render(Object.new, locals)
end

我们可以使用如下所示的部分:

%p You passed in #{foo}

并从我们的模板中调用它:

%body
  =render :partial, :foo => "bar"

这将呈现

<body>
  <p>You passed in bar</p>
</body>

Layouts

在 Rails 中,您可以为视图指定布局,以便所有页面可以共享相同的布局 标题、菜单区域等。这是通过指定布局文件来完成的,您可以在其中调用yield渲染相关的实际视图。添加到 haml 的布局稍微复杂一些,但仍然可以完成。

Hamls render方法还接受一个块,因此一个简单的解决方案是渲染布局文件,并传递一个渲染视图文件的块:

Haml::Engine.new(File.read("layout.html.haml")).render do
  Haml::Engine.new(File.read("view.html.haml")).render
end

这将给出的内容layout.html.haml呈现的内容view.html.haml在布局文件包含的位置呈现=yield.

内容_for

不过 Rails 比这更灵活一些。它可以让你打电话yield在布局文件中多次,在每种情况下命名特定区域,并使用content_for方法在你的观点之内。所以在你的布局文件中:

!!!
%html
  %head
    = yield :title
  %body
    =yield

在你看来:

-content_for :title do
  %title Hello
%p
  Here's a paragraph.

Rails 实际工作的方式是首先渲染视图部分,存储所有不同的部分,然后渲染布局,传递一个提供适当块的块yield在布局中被调用。我们可以使用一个小帮助器类来复制它来提供content_for方法并跟踪每个区域的渲染块:

class Regions  
  def initialize
    @regions_hash={}
  end

  def content_for(region, &blk)  
    @regions_hash[region] = capture_haml(&blk)
  end

  def [](region)
    @regions_hash[region]
  end
end

这里我们使用的是capture_haml method http://haml.info/docs/yardoc/Haml/Helpers.html#capture_haml-instance_method获取渲染的 haml,而不直接输出。请注意,这不会捕获视图的未命名部分。

我们现在可以使用辅助类来渲染最终输出。

regions = Regions.new
unnamed = Haml::Engine.new(File.read("view_named.html.haml")).render(regions)

output = Haml::Engine.new(File.read("layout_named.html.haml")).render do |region|
  region ? regions[region] : unnamed
end

现在变量output包含最终渲染的输出。

请注意,此处的代码并未提供 Rails 所包含的所有灵活性,但希望它足以向您展示从哪里开始自定义 Haml 以满足您的需求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

独立于 Rails 在 HAML 文件中使用布局 的相关文章

  • 从 Ruby 中的 DateTime 变量获取时间

    我在 ruby 中工作 我有一个包含数据库中今天的日期时间的对象 我只想要时间截断数据 我怎样才能得到那个 Try 日期时间 strftime http www ruby doc org stdlib 1 9 3 libdoc date r
  • 有没有人有 Ruby 和 Rake 的 Notepad++ 函数列表插件的解析规则

    我使用 Notepad 编辑 rake 文件 并且希望能够使用函数列表插件 我无法在线找到任何解析规则 并且 语言解析规则 对话框没有非常清晰的记录 我正在将方法解析到以下列表中 但还想显示任务 Function Begin t def t
  • 如何向 Time.now 添加两周?

    如何在 Ruby 中向当前 Time now 添加两周 我有一个使用 DataMapper 的小型 Sinatra 项目 在保存之前 我有一个字段填充了当前时间加上两周 但未按需要工作 任何帮助是极大的赞赏 我收到以下错误 NoMethod
  • 如何计算带有偏移量的异或?

    我想用不同的偏移量进行异或计算以在计算中列出 例子 key 0 1 0 text 0 1 0 1 0 1 0 1 1 1 异或计算 key 0 text 0 key 1 text 1 key 2 text 2 key 0 text 3 ke
  • Ruby 枚举器中的“break”与“raise StopIteration”

    如果我使用 Ruby Enumerators 来实现生成器和过滤器 generator Enumerator new do y x 0 loop do y lt lt x x 1 break if x gt CUTOFF end end l
  • 如何从 Ruby 程序发送邮件?

    我想从 Ruby 应用程序发送电子邮件 核心语言中是否有调用来执行此操作 或者是否有我应该使用的库 最好的方法是什么 如果你不想使用行动邮递员 http wiki rubyonrails org rails pages ActionMail
  • Rails 4:资产未在生产中加载

    我正在尝试将我的应用程序投入生产 但图像和 CSS 资源路径不起作用 这是我目前正在做的事情 图像资源位于 app assets images image jpg 样式表位于 app assets stylesheets style css
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • “rmagick”gem 安装问题

    我在尝试在 centos 上安装 rmagick gem 时遇到问题 以下是我得到的输出 谁能帮我识别一下我缺少什么包裹 我已经安装了所有提到的另一个堆栈溢出线程 RMagick安装错误 https stackoverflow com qu
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • ruby从1.8.7升级到1.9.2(使用Rails 3.1.1)后本地服务器错误

    我刚刚安装了rvm并使用rvm将ruby从1 8 7升级到1 9 2 我在我的应用程序上运行了捆绑安装 它重新安装了我的 gems 当我在本地运行 Rails 服务器并将浏览器导航到 localhost 3000 时 服务器日志中显示以下错
  • 红宝石接球和效率

    catch在 Ruby 中意味着跳出深度嵌套的代码 在 Java 中 例如用Java也可以达到同样的效果try catch用于处理异常 但它被认为是糟糕的解决方案 而且效率非常低 在 Ruby 中 我们有处理异常的方法begin raise
  • 如何使用 net/http 验证 ruby​​ 中的 SSL 证书链

    我如何验证网站的证书 例如https processing ukash com https processing ukash com 在 ruby 中使用 net http https Net HTTP new processing uka
  • 使用rSpec 测试delayed_job 链的最佳方法是什么?

    目前 当我的代码中有一个延迟方法时 如下所示 CommentMailer delay deliver comments comment true 我在规范中写了这样的内容 dj mock DelayProxy CommentMailer s
  • Rails/Ruby 合并两个具有相同键、不同值的哈希值

    我有两个想要合并的哈希值 它们看起来像这样 Hello gt 3 Hi gt 43 Hola gt 43 第二个哈希看起来像 Hello gt 4 Hi gt 2 Bonjour gt 2 我想合并这两个哈希数组 使结果看起来像 Hello
  • 带有 OAuth2 的 YouTube API v3:更新和删除失败并出现“权限不足”错误

    我在尝试着update and delete视频使用YouTube API v3 https developers google com youtube v3 docs videos with OAuth2 用于身份验证 https dev
  • 我可以让这个 Ruby 代码更快并且/或使用更少的内存吗?

    我有一个Array of StringRuby 中的对象由如下单词组成 animals cat horse dog cat dog bird dog sheep chicken cow 我想将其转换为另一个Array of String对象
  • ruby on Rails:音频/mp3 内容标题下载

    如何在 ruby rails 中设置下载标题 在 php 中 我为 mp3 下载设置标头 如下所示 header Content Transfer Encoding binary header Content type audio mp3
  • Ruby 动态变量名

    有没有办法在 Ruby 中创建具有动态名称的变量 我正在读取一个文件 当我找到一个字符串时 会生成一个哈希值 e g file File new games log r file lines do l l split do p if p 1
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行

随机推荐

  • 如何在 Windows 上通过 Vim 使用 MinGW make

    我已经在我的机器上安装了 Vim 和 MinGW 所以我尝试创建 Hello World 然后在 Vim 中编译 一切正常 但是当我输入时 make它显示错误 make not recognized as an internal or ex
  • JQuery 菜单无法正常工作

    我正在尝试 Jquery 菜单小部件 但由于某种原因它不起作用 我在浏览器和 JSFiddle 上都尝试过 http jsfiddle net evanevee MANH4 2 http jsfiddle net evanvee MANH4
  • Java 中间隔重复算法的开源实现 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在从事一个项目 其中间隔重复至关重要 但我不是该主题的专家 我害怕重新发明方轮 我的研究指出了两个不
  • 用于 Java 集成测试的 Groovy 是否有更好的替代方案? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我计划使用其编程接口来测试我的基于 Java 的 Web 应用程序 为此 我打算使用它们的 RMI We
  • WEB-INF 在 Java EE Web 应用程序中代表什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 互联网上的大多数地方都说它代表WEB INF信息 我比较怀疑 该文件夹包含可执行文件 信息不是一个合适的名字 据我所知 正如你所说 INF 代表
  • 如何从 GTK Builder 检索对象的名称? [复制]

    这个问题在这里已经有答案了 如何获取从 Builder 对象检索的 Gtk Widget 的名称 我特指的是在 Glade 中看到的名字 例如 button1 而不是类的名称 GtkWindow 这个问题与this one https st
  • 基准和处理时间结果的差异

    我一直在尝试对替换数据框中的 NA 的最有效方法进行一些测试 我首先在 100 万行 12 列的数据集上比较 NA 与 0 的替换解决方案 把所有有管道能力的都扔进去microbenchmark我得到以下结果 问题一 有没有办法测试子集左赋
  • Oracle查询将多列转换为一列

    我的表中有 50 列 它只返回一行 我希望 50 列的一行显示为 50 行和 1 列 任何人都可以建议我使用 Oracle 查询吗 您可以使用UNPIVOT对于像这样的一行 仅获取包含值的列 SELECT colvalue FROM SEL
  • 在单独的 cpp 文件中进行 Boost 单元测试

    我想将 Boost 单元测试分成单独的 cpp 文件 例如 Test1 cpp Test2 cpp Test3 cpp 等 这样我就不会在单个 cpp 文件中包含 1000 个测试 到目前为止 当我尝试构建时 我遇到了各种错误 测试1 cp
  • 节或组名称“oracle.manageddataaccess.client”已定义

    将 Oracle ManagedDataAccess dll 从版本 4 121 1 0 更新到版本 4 121 2 0 后 由于我无法使用 NHibernate 保存先前版本中 CLOB 类型的值 因此在客户端计算机上出现以下错误 Sys
  • 使用马哈拉诺比斯距离进行多变量离群值去除

    我的数据有异常值 我怎样才能找到马哈拉诺比斯距离 并用它来删除异常值 首先让我提出一些一般准则 实际上 如果你有很多特征和较少的样本 马哈拉诺比斯算法往往会给出误导性的结果 你可以自己尝试一下 所以你拥有的特征越多 你应该提供的样本就越多
  • 埃拉托色尼真筛——用于生成素数的算法

    今天读到一篇论文 奥尼尔 梅丽莎 E 正版 埃拉托斯特尼筛法 http www cs hmc edu oneill papers Sieve JFP pdf杂志 函数式编程 已出版 剑桥大学出版社在线 2008 年 10 月 9 日 doi
  • Spring Social NoSuchMethodError SocialAuthenticationFilter.getFilterProcessesUrl()

    我使用Spring Security登录 现在我正在尝试添加 spring 社交 facebook 登录 但我收到很多错误信息 首先 当我尝试使用相同的方法时春季社交指南 http spring io guides gs accessing
  • Hibernate 4.3.5 不适用于 Oracle10g 数据库

    我正在尝试使用 Hibernate 4 3 5 和 Oracle 数据库 但在运行过程中我遇到了以下问题 相同的代码在 MySQl 数据库中运行良好 org hibernate engine jdbc connections interna
  • Java 中 C# ObservableCollection 的等效项

    我想知道是否存在一种数据结构 其行为类似于 ObservableCollection 几乎就像 C 中一样 能够采用某种类型 ex 在 C 中我可以说 ObservableCollection
  • 通过浏览器链接在代码中连接 teamviewer

    我有一个问题让我抓狂 我已经成功地将我的 teamviewer 会话从浏览器 uri 连接到我所需的远程资源 我通过在浏览器地址栏中使用以下 uri 命令来实现此目的 实际上 这是 html 中的按钮单击 teamviewer8 remot
  • SPARK SQL 中的相关子查询列不允许作为非相等谓词的一部分

    我正在尝试在 where 子句中编写一个子查询 如下所示 但我越来越 非等式谓词中不允许有相关列 SELECT holidays FROM SELECT s holidays s entity FROM transit t tt WHERE
  • Angular bootstrap ui 模式使用相同的控制器而不是新的控制器

    我正在使用 Angular Bootstrap ui 模态框 它说要为新控制器提供一个新的 modalInstance 我想使用与初始化模态框相同的控制器 我搜索但没有成功 我找到了此链接 但没有成功 如何在 Angular UI Boot
  • 使用 Linq 将列表框项值转换为 int

    我使用列表框显示数据库中表的内容 每个列表框项目都使用设置为友好名称的 Text 属性和设置为唯一 ID 列的 Value 属性进行填充 数据库结构可能类似于以下内容 CREATE TABLE GENERIC FRIENDLY NAME T
  • 独立于 Rails 在 HAML 文件中使用布局

    我的最终目标是创建几个静态 HTML 文件以交给其他人 但对于我的工作流程 我希望将 HAML 作为基本源文件 在这样做时 我希望至少在我这边能够干燥这个过程 现在我有很多页面最终将共享一个通用布局 我想知道如何合并这些布局 这是我当前的代