我试图创建一个Sinatra助手,它返回一个动态生成的HTML。我想我会用一个here字符串作为静态位,用一个lambda来计算动态部分。
foo_helper.rb
:
require 'erb'
module FooHelper
def tabs(selected)
template = ERB.new <<~HERE
<ul class="nav nav-tabs">
<li class="nav-item"><a class="nav-link <%= 'active' if selected == 'favorites' %>" href="/foo/favorites">Favorites</a></li>
<li class="nav-item"><a class="nav-link <%= 'active' if selected == 'all' %>" href="/foo">All</a></li>
<%= alpha.call %>
</ul>
HERE
# binding to a string works as expected
# alpha = "<li class='nav-item'><a class='nav-link' href='/foo/a'>A</a></li>"
# binding to a lambda, doesn't
alpha = lambda {
('a'..'z').each do |letter|
"<li class='nav-item'><a class='nav-link #{ 'active' if selected == letter }' href='/foo/#{letter}'>#{letter}</a></li>"
end
}
template.result(binding)
end
end
foo_controller.rb
:
class FooController < ApplicationController
helpers FooHelper if defined?(FooHelper)
...
end
index.erb
:
...
<%= tabs('favorites') %>
...
显示范围,而不是单个
li
s。
**编辑**
改正了许多错误。