content_tag在视图和帮助器中的行为不同

时间:2013-09-26 01:22:47

标签: ruby-on-rails views ruby-on-rails-4 helpers content-tag

有人可以解释为什么content_tag在视图和助手中有不同的行为?如下所示的简单代码在视图中返回(1),但(2)在Helper中时返回。

  arr = ["a", "b", "c"]
  concat content_tag(:ul, :class => 'a class') do
    arr.each do |item|
      concat content_tag(:li, item)
    end
  end

(1)

<ul class="a class">
  <li>a</li>
  <li>b</li>
  <li>c</li>
</ul>

(2)

<ul>{:class=&gt;"a class"}</ul>

在帮助程序中使用content_tag(:ul, '', :class => 'a class')时,它会呈现<ul class="a class"></ul>。为什么这种不同的行为呢?

content_tag的行为非常令人困惑。我尝试了捕捉(另一种令人困惑的方法!)方法,但没有任何成功。

所以...任何想法?

PS。:我正在使用rails 4

-------------编辑--------------

由于我的例子真的很糟糕,我真正想做的就是那样的事情:

  def language_dropdown
    content_tag :li, class: "dropdown language" do
      concat content_tag(:a, content_tag(:span, I18n.locale, class: "username"),
                     class: "dropdown-toggle", data: { toggle: "dropdown", hover: "dropdown", "close-others" => "true" } )

      concat( content_tag(:ul, class: "dropdown-menu") do
        I18n.available_locales.each do |locale|
          if locale != I18n.locale
            locale_key = "translation.#{locale}"
            content_tag :li do
              concat(link_to I18n.t(locale_key), url_for(locale: locale.to_s))
            end
          end
        end
      end)
    end.html_safe
  end

1 个答案:

答案 0 :(得分:2)

这对我有用......

module ApplicationHelper
  def some_helper arr
    content_tag(:ul, :class => 'a class') do
      arr.each do |item|
        concat(content_tag(:li, item))
      end
    end
  end
end

从第一个content_tag中删除concat,并在内部concat方法中添加括号。

<强>更新

content_tag :li, class: "dropdown language" do
  concat(content_tag(:a,content_tag(:span, I18n.locale, class: "username"),
    class: "dropdown-toggle", data: { toggle: "dropdown", hover: "dropdown", "close-others" => "true" }))
  concat(content_tag(:ul, class: "dropdown-menu"){
    I18n.available_locales.each do |locale|
      if locale != I18n.locale
        locale_key = "translation.#{locale}"
        concat(content_tag(:li){link_to(I18n.t(locale_key), url_for(locale: locale.to_s))})
      end
    end
  })
end

同样的事情,您需要添加括号并删除代码中的第一个concat ...

更新2:

items = ""
I18n.available_locales.each do |locale|
  if locale != I18n.locale
    locale_key = "translation.#{locale}"

    items += content_tag(:li) do
      link_to(I18n.t(locale_key), url_for(locale: locale.to_s))
    end
  end
end

label = content_tag(:span, I18n.locale, class: "username")
link = content_tag(:a, label, class: "dropdown-toggle",
    data: { toggle: "dropdown", hover: "dropdown", "close-others" => "true" })

content_tag :li, class: "dropdown language" do
  concat(link)
  concat(content_tag(:ul, class: "dropdown-menu"){ items.html_safe })
end