2013-09-26 41 views
1

有人可以解釋爲什麼content_tag在視圖和助手中有不同的行爲?一個簡單的代碼如下所示,在視圖中返回(1),但在(2)在Helper中時。content_tag在視圖和助手中的行爲不同

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:我使用的是軌道4

-------------編輯--------------

由於我的例子是非常糟糕的,我真正想要做的是somethind這樣的:

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 

回答

2

這工作形成了我......從第一content_tag

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 

刪除CONCAT和Add(添加)球拍進入內部連接方法。

更新:

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 
+0

在帖子中查看我的更新。 – delta

+0

嗯,不錯。它看起來像我把concat放在錯誤的地方。這似乎有點混亂,任何其他更好的方式來做到這一點? – delta

+1

你可以分開你的代碼,使其更具可讀性。 – Leantraxxx