如何在红宝石中直接使用Slim

时间:2014-11-19 15:19:45

标签: ruby slim-lang

我想创建一个基本的ruby脚本,将Slim模板呈现为html(这最终将成为更大项目的一部分)。理想情况下,我想使用脚本中生成的HTML。

我理解这可以使用TILT(如SLIM README中所示),其中包含以下内容:


Slim使用Tilt编译生成的代码。如果要直接使用Slim模板,可以使用Tilt界面。

 Tilt.new['template.slim'].render(scope)
 Slim::Template.new('template.slim', optional_option_hash).render(scope)
 Slim::Template.new(optional_option_hash) { source }.render(scope)

可选选项哈希可以包含上面部分中记录的选项。范围是执行模板代码的对象。


但是,我仍然无法成功运行此功能。因此,我想知道是否有人可以通过制作一个有效的例子来帮助我。

编辑(最近已对此进行了编辑):

我已经玩了很多代码,但我继续收到以下错误:

 undefined local variable or method `source' for main:Object (NameError)

这就是我正在运行的:

require 'slim'

# I'm not sure about the next two lines...
optional_option_hash = {}
scope = Object.new    

Tilt.new('template.slim').render(scope)
Slim::Template.new('template.slim', optional_option_hash).render(scope)
Slim::Template.new(optional_option_hash) { source }.render(scope)    

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

请参阅Specifying a layout and a template in a standalone (not rails) ruby app, using slim or haml

这是我最终使用的:

require 'slim'

# Simple class to represent an environment
class Env
  attr_accessor :name
end

scope = Env.new
scope.name = "test this layout"

layout =<<EOS
h1 Hello
.content
  = yield
EOS

contents =<<EOS
  = name
EOS

layout = Slim::Template.new { layout }
content = Slim::Template.new { contents }.render(scope)

puts layout.render{ content }

对于范围,您可以放入模块/类甚至self

答案 1 :(得分:1)

的快速要领
  module SlimRender

    def slim(template, variables = {})
      template = template.to_s
      template += '.slim' unless template.end_with? '.slim'
      template = File.read("#{ROOT}/app/views/#{template}", encoding: 'UTF-8')
      Slim::Template.new { template }.render OpenStruct.new(variables)
    end

  end

在您的班级中加入SlimRender并:

  def render_something
    slim 'streams/scoreboard', scores: '1-2'
  end