我编写了一个Rails助手来创建一个嵌套的
HTML列表.但是,这不能正确呈现.我做错了什么?
帮手
content_tag :ul do [1,2].each do |x| content_tag(:li,x) content_tag :ul do ['a','b'].each do |y| content_tag(:li,y) content_tag :ul do ['i','ii'].each do |z| content_tag(:li,z) end end end end end end
预期产出
<ul> <li>1</li> <ul> <li>a</li> <ul> <li>i</li> <li>ii</li> </ul> <li>b</li> <ul> <li>i</li> <li>ii</li> </ul> <li>2</li> <ul> <li>a</li> <ul> <li>i</li> <li>ii</li> </ul> <li>b</li> <ul> <li>i</li> <li>ii</li> </ul> </ul> </ul>
实际输出
<ul></ul>
解决方法
这是解决方案:
content_tag(:ul) do [1,2].map do |x| content_tag(:li,x) << content_tag(:ul) do ['a','b'].map do |y| content_tag(:li,y) << content_tag(:ul) do ['i','ii'].map do |z| content_tag(:li,z) end.join('').html_safe end end.join('').html_safe end end.join('').html_safe end
问题是您必须在每个content_tag块的末尾返回一个HTML安全字符串:
# returns <li>asd</li> content_tag('li') { 'asd' } # returns <ul><li>asd</li></ul> content_tag('ul') { content_tag('li') { 'asd' } } # returns [1,2] [1,2].each{ |x| content_tag('li',x) } # returns ["<li>1</li>","<li>2</li>"] [1,2].map{ |x| content_tag('li',x) } # returns "<li>1</li><li>2</li>" not marked as HTML safe,# because `join` generates a new string [1,x) }.join('') # returns "<li>1</li><li>2</li>" marked as HTML safe [1,x) }.join('').html_safe # returns "<ul><li>1</li><li>2</li></ul>" content_tag('ul') do [1,x) }.join('').html_safe end # returns "<ul><li>1</li><li>2</li></ul>" content_tag('ul') do content_tag('li') { 'asd' } # this is ignored,since it is not returned [1,x) }.join('').html_safe end # returns "<ul><li>asd</li><li>1</li><li>2</li></ul>" content_tag('ul') do content_tag('li') { 'asd' } << [1,x) }.join('').html_safe end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。