2013-09-26 6 views
1

Кто-то может объяснить мне, почему у content_tag другое поведение в поле зрения и помощники? Простой код, подобный приведенному ниже, возвращает (1) в представлении, но (2), когда в помощнике.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') в Helper, он оказывает <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

Это работает образуют меня ...

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 из первого content_tag и добавьте б ракетки во внутренний метод concat.

Update:

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 к коду ...

Update 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

Хммм хороший. Похоже, я положил конкат в неправильное место. Кажется, это немного беспорядочно, любой другой лучший способ сделать это? – delta

+1

Вы можете отделить свой код, чтобы сделать его более читаемым ... – Leantraxxx