簡體   English   中英

如何在Sinatra中編寫Slim幫助程序?

[英]How do I write Slim helpers in Sinatra?

我正在使用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函數並從中返回結果?

您根本不需要塊,只需返回字符串,它就會被包含在模板中的那個位置:

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

helpers SlimHelpersinclude SlimHelpers ,在Sinatra中,您通常會使用helpers SlimHelpers而不是include SlimHelpers (盡管通過簡單地調用include來實現helpers工具 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM