我正在使用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
函数并返回结果?
答案 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
)。