我如何在 Sinatra 中编写 Slim 助手?

How do I write Slim helpers in Sinatra?

我正在使用 Sinatra 和 Slim。我正在尝试找出如何为 Slim 编写一个帮助程序,以便我可以干燥我的模板。 (在这种情况下,helper 很小,我可以使用内联 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])/, ' ').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 函数并从中得到 return 结果?

您根本不需要块,只需 return 字符串,它就会包含在您的模板中:

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

顺便说一句,对于 Sinatra,您通常会使用 helpers SlimHelpers rather than include SlimHelpers (although helpers is implemented by simply calling include).