如何创建可同时渲染并返回内容的HAML6辅助方法?
解决HAML tabular辅助方法统计行不输出的问题
你的问题核心在于两点:
- 用
- tabular(items) do ...调用方法时,HAML仅执行方法逻辑,不会自动输出方法的返回值 - 块内的HAML代码由HAML引擎单独解析执行,但方法最后返回的统计行HTML没有被注入到输出缓冲区
给你两种可行的解决方案:
方案一:用concat直接输出统计行
修改辅助方法,使用视图的concat方法把统计行直接写入模板输出缓冲区,无需改变原有的HAML调用方式:
def tabular(items) total = 0 items.each do |i| total += 1 yield i end # 用concat直接将统计行输出到模板 concat "<tr><td>Total: #{total}</td></tr>" end
HAML用法保持不变:
%table - tabular(items) do |i| %tr %td = i[:title]
方案二:捕获块输出并返回完整HTML
如果更倾向于让方法返回所有HTML内容,可使用capture方法收集块内生成的行,再拼接统计行,最后在HAML里用=调用方法:
def tabular(items) total = 0 # 捕获每个item对应的HAML输出 rows = items.map do |i| total += 1 capture(i) { yield i } end.join # 拼接统计行后返回完整HTML rows + "<tr><td>Total: #{total}</td></tr>" end
对应的HAML调用要改成=:
%table = tabular(items) do |i| %tr %td = i[:title]
内容的提问来源于stack exchange,提问作者yegor256
相关产品推荐
相关产品推荐

