【问题标题】:Include a slim file in another slim file在另一个 slim 文件中包含一个 slim 文件
【发布时间】:2013-09-27 01:54:06
【问题描述】:

我正在开发一个静态网站(因此没有真正的服务器支持),我想在另一个网站中加入一个小型的 sn-p,可能会向它传递一个变量。

这可能吗?在 Rails 中很容易,虽然 render 方法,但我不知道如何在 slim 上做到这一点(显然 load 方法不适用于 slim)。

【问题讨论】:

    标签: ruby slim-lang static-html


    【解决方案1】:

    这个帖子帮助我编写了一个非常杀手级的 partials 助手,它为您提供了类似 Rails 的 partials 功能。我真的很满意!

    #partials_helper.rb
    module PartialsHelper
      def partial(name, path: '/partials', locals: {})
        Slim::Template.new("#{settings.views}#{path}/#{name}.slim").render(self, locals)
      end
    end
    

    -

    #app.rb
    require 'slim'
    require 'slim/include'
    require 'partials_helper'
    require 'other_helper_methods'
    
    class App < Sinatra::Base
      helpers do
        include PartialsHelper
        include OtherHelperMethods
      end
    
      get '/' do
        slim :home
      end
    end
    

    -

    #views/home.slim
    == partial :_hello_world, locals: { name: 'Andrew' }
    

    -

    #views/partials/_hello_world.slim
    h1 Hello, World! Hello #{name}!
    

    我最初只有.render({}, locals),这意味着partials 无法访问OtherHelperMethods 中包含的任何辅助方法(但home.slim 可以)。将self 传递给.render,作为第一个参数,可以解决这个问题(如果你对此感到好奇,请查阅Tilt::Template #render 文档。

    使用此 PartialsHelper,传递局部变量是可选的,指定不同路径到局部(相对于 settings.views)也是如此。

    希望你能像我一样充分利用它!

    【讨论】:

    • 整个目的是为 静态网站 使用 slim,但您在 sinatra 中运行帮助程序,这是动态的:P
    【解决方案2】:

    Slim 包含Include 插件,允许在编译时将其他文件直接包含在模板文件中:

    require 'slim/include'
    
    include partial_name
    

    文档可在此处获得:https://github.com/slim-template/slim/blob/master/doc/include.md

    如果您需要在运行时包含文件

    Slim::Template.new("#{ name }.slim").render 完成这项工作 (https://github.com/slim-template/slim#include-helper)。

    【讨论】:

    • 嗯,我不必添加“要求”。也许,那是因为 rails 会自动为我做这件事
    【解决方案3】:

    如果您想使用 Slim 构建静态网站,我会强烈建议您查看 Middleman。 Middleman 从 Padrino 借用了常见的辅助函数,如 renderpartial,Padrino 是一个类似于 Rails 的 Web 框架,但使用更轻量级的 Sinatra 构建(所有这些都是很棒的软件)。

    重点是您可以将 Middleman 配置为使用 slim,然后任意嵌套部分(或布局)。如果遇到障碍,请查看this stack overflow thread。不过这很简单!

    Middleman 文档解释了如何使用部分 here,您可以在 my gist for embedding an HTML5 video player 中查看真实示例的外观。

    【讨论】:

    • 非常感谢,这看起来很有趣,我最终暂时使用了 Grunt 和 angularjs,不再需要 renderpartial。不过,对于没有角度的网站,这很棒,我现在正在检查。
    【解决方案4】:

    貌似可以这样实现:

    Slim::Template.new('template.slim', optional_option_hash).render(scope)
    

    在 slim readme 中找到:https://github.com/slim-template/slim

    【讨论】:

    • 您能详细说明一下这个答案吗?我正在尝试做同样的事情。假设文件的名称是 index.slim,我想在其中包含部分 _variables.slim。谢谢!
    • 好吧,只要输入你的 slim 文件 Slim::Template.new('_variables.slim', optional_option_hash).render(scope) 就没什么好说的了,“部分”的东西只在 Rails 中可用,而不是在 Slim 中。如果你使用 Rails,你只需要render 'variables'
    • 谢谢。太糟糕了,它只适用于 Rails。我正在使用 Codekit 将 Slim 模板编译成静态 html,但如果没有该功能,它就毫无用处。我会用 Jade。
    • 您可以使用 Slim::Template 代码轻松模拟 slim 中的部分功能。
    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2012-05-01
    • 2010-09-18
    相关资源
    最近更新 更多