Ruby 在Sinatra辅助方法中使用here字符串和lambda

Ruby 在Sinatra辅助方法中使用here字符串和lambda,ruby,sinatra,Ruby,Sinatra,我试图创建一个Sinatra助手,它返回一个动态生成的HTML。我想我会用一个here字符串作为静态位,用一个lambda来计算动态部分 foo_helper.rb: index.erb: 结果: 显示范围,而不是单个lis 我是不是漏掉了什么 **编辑** 更正了大量错误。代码中的错误太多了 @nav是在模块级定义的,但在实例级访问,所以在需要时可以得到零。 当调用lambda时,在变量名和左括号之间需要一个点,如foo.123 @真的吗?假定的@nav类型是什么?该类型是否具有实例方法foo

我试图创建一个Sinatra助手,它返回一个动态生成的HTML。我想我会用一个here字符串作为静态位,用一个lambda来计算动态部分

foo_helper.rb:

index.erb:

结果:

显示范围,而不是单个lis

我是不是漏掉了什么

**编辑**


更正了大量错误。

代码中的错误太多了

@nav是在模块级定义的,但在实例级访问,所以在需要时可以得到零。 当调用lambda时,在变量名和左括号之间需要一个点,如foo.123 @真的吗?假定的@nav类型是什么?该类型是否具有实例方法foo? 不会执行foo,因为它是一个局部变量,而不是一个方法。 它呈现..z的原因是,从lambda中调用的方法为每个元素执行给定的块,然后再次返回范围本身

在这里,您希望使用的是方法。与每个元素类似,它也为每个元素执行一个块,但所述块的返回值在新数组中返回

作为比较:

p ("a".."c").each { |x| x.upcase }
#=> "a".."c"

p ("a".."c").map  { |x| x.upcase }
#=> ["A", "B", "C"]

除非您的代码中缺少上面没有显示的内容,否则ruby不会以您认为的方式将@nav解释为实例变量。
class FooController < ApplicationController
  helpers FooHelper if defined?(FooHelper)
  ...
end
...
<%= tabs('favorites') %>
...
p ("a".."c").each { |x| x.upcase }
#=> "a".."c"

p ("a".."c").map  { |x| x.upcase }
#=> ["A", "B", "C"]