Sinatra 和 Slim return Ruby 函数

Sinatra and Slim return Ruby function

我有一个使用 Sinatra 构建并使用 Slim 模板的小型 Web 应用程序。 在我的 functions.rb 文件中,我定义了一个名为 $locations 的散列,我想使用一个函数从散列中获取 return 值。这是我拥有的:

# functions.rb
$locations = Hash[
  'wa' => Hash[
    'capital' => 'Olympia'
  ],
  'or' => Hash[
    'capital' => 'Salem'
  ]
]
def foobar
  $locations.each do |key, value|
    $locations[key]['capital']
  end
end

我的 Slim 文件

/ layout.slim
div#capitals = foobar

呈现时,页面有一个 div,其 ID 为大写字母,但内容只是用括号打印出的整个哈希值。如果我将 each do 的内部更改为: puts $locations[key]['capital'] 和 运行 命令行中的函数,它可以完美运行。我怎样才能让它在 Sinatra 中工作?

基本上,我想用 Ruby 来完成这个 PHP 脚本(能够在我的脚本中的任何地方调用该函数并让它打印出 <div> 标签):

<?php
$locations = array(
  'wa' => array(
    'capital' => 'Olympia'
  ),
  'or' => array(
    'capital' => 'Salem'
  )
);

function foobar($array) {
  foreach ($array as $key => $value) {
    echo "<div>" . $array[$key]['capital'] . "</div>";
  }
}
foobar($locations);

在您的循环中,value 该键的哈希值。此外,您希望 return 向调用者提供大写字母。 #each 枚举元素但 return 是集合,而不是 return 在每次迭代时由块编辑的值。您想要 #map(或 #collect):

def foobar
  $locations.map do |_key, value|
    value['capital']
  end
end

或:

def foobar
  $locations.values.map do |value|
    value['capital']
  end
end

更新:我不太了解 Slim,但根据你的 PHP 示例,在我看来你想要这样的东西:

- for capital in foobar
  div= capital