Rails 5 个标签助手,标签名称在变量中

Rails 5 tag helper with tag name in variable

我正在转换一些使用 content_tag 的旧代码,如下所示:

wrap_tag = 'p'
....
content_tag(wrap_tag, class: 'etc') do
  'some content'
end

生成预期的

<p class="etc">
Some content
</div>

我现在想更新为使用 tag 语法,但我遇到了问题:

wrap_tag = 'p'
...
tag wrap_tag, class: 'etc' do
  'some content'
end

尝试: tag.wrap_tag 给出 "<wrap-tag>some content</wrap-tag>"

不出意料,只是下划线变成了连字符。

其他变化:

注意:以上所有示例都包含最初显示的 do..content..end

有没有办法在变量中包含标签名称并包含内容?

谢谢


尝试 jvillian 的建议使用 send 我发现

wrap_tag = 'p'
content = 'some text'
helper.tag.send(wrap_tag, content)

returns "some text",通常 returns 第二个和后续参数。


看起来 actionview/helpers/tag_helper.rb,content_tag 方法确实检查了 block_given?而 tag 没有。

但是为什么yyyyyyyy(不是) 我将不得不再次通读 PR 以找出答案。

我发现如果我这样做:

@arg = :div
tag.send @arg, class: 'etc' do 
  'some content'
end

...然后我得到:

<div class="etc">some content</div>

同样,如果我这样做:

@arg = :section
tag.send @arg, class: 'etc' do 
  'some content'
end

...然后我得到:

<section class="etc">some content</section>

但是,如果我这样做:

@arg = :p
tag.send @arg, class: 'etc' do 
  'some content'
end

...然后我得到:

{:class=>"etc"}

这显然不是人们所期望的。而且,看起来很奇怪,因为:

tag.p class: 'etc' do 
  'some content'
end

...给出:

<p class="etc">some content</p>

...全是阳光和棒棒糖。

小精灵?只能想一想了。