如何在Sinatra中编写Slim助手?

时间:2015-06-03 00:28:09

标签: ruby sinatra slim-lang

我正在使用Sinatra和Slim。我正在尝试找出如何为Slim编写帮助程序,以便我可以干掉我的模板。 (在这种情况下,帮助程序很小,我可以使用内联Ruby,但是将来我会做更复杂的事情。)

我在lib / slim_helpers.rb文件中有以下帮助程序(展开调试):

module SlimHelpers

  # foo converts strings like 'AWS::AutoScaling::AutoScalingGroup'
  # to 'Auto Scaling Group'
  def foo(input, &block)
    last = input.split('::')[-1]
    result = last.gsub(/([A-Z])/, ' \1').lstrip
    puts "result: #{result}"
    yield result
  end

end

我有以下(简化)Sinatra应用程序:

require 'sinatra/base'
require 'slim'
require_relative 'lib/slim_helpers.rb'

class SinatraApp < Sinatra::Base
  include SlimHelpers

  get '/' do
    puts '==> in /'
    @result = Bar.bar('dev')
    slim :qux
  end

end

在我的模板中,我有以下代码:

- result.resources.each do |r|
  div class="list-group"
    div class="list-group-item active"
      h5 class="list-group-item-heading"
      = foo r["ResourceType"]

但是,我在渲染网页时遇到以下错误:

LocalJumpError at /some/url
no block given (yield)
file: slim_helpers.rb location: foo line: 9
BACKTRACE
/Path/lib/slim_helpers.rb in foo
  yield result
/Path/views/asg.slim in block (3 levels) in singleton class
  = foo r["ResourceType"]
... etc

所以我想知道这里的块是什么,以及如何将输入传递给我的foo函数并返回结果?

1 个答案:

答案 0 :(得分:1)

根本不需要块,只需返回字符串,它将包含在模板中的那一点:

def foo(input)
  last = input.split('::')[-1]
  result = last.gsub(/([A-Z])/, ' \1')
  puts "result: #{result}"
  result # or 'return result' if you prefer
end

顺便说一句,对于Sinatra,您通常会使用helpers SlimHelpers而不是include SlimHelpers(尽管helpers is implemented by simply calling include)。