2015-08-11 4 views
0

Я использую content_tag без проблем для вывода списков div или неупорядоченных и т. Д. При этом я не могу понять, как заставить content_tag работать с таблицами. Я получаю причудливые результаты. Я видел похожие вопросы, говорящие о том, что вам нужно использовать concat.Rails 4.2 content_tag для вывода таблицы

На самом базовом уровне, если я пытаюсь что-то вроде этого в методе:

def mymethod(item) 
    content = "" 

    content << content_tag(:table, :class => "table-striped") do 

     concat(content_tag(:thead)) do 
     headlabel = ["Header1","Header2"] 
     concat(content_tag(:tr)) do 
      headlabel.each do |hlabel| 
      concat(content_tag(:th, hlabel)) 
      end 
     end 
     end 

    end # end content_tag table 

    return content.html_safe 

end 

будет возвращен. Thead пуст

<table class="table-striped"> 
    <thead> 
    </thead> 
</table> 

Я не уверен, что я делаю неправильно.

+0

Почему у вас есть вложенные звонки в concat? –

+1

Почему вы определяете метод для этого вместо кодирования таблицы в представлении или частичном? – eirikir

+0

Я принял с таблицами, и я сделал это. Если удалить вложенный вызов Concat я получаю те же результаты Это приведет к тому же результату определения функции MyMethod (пункт) содержания = «» содержания << content_tag (: таблица,: класс => «стол- полосатый ") у CONCAT (content_tag (: THEAD)) делать headlabel = [" HEADER1" , "hEADER2"] content_tag (: тр) сделать headlabel.each сделать | hlabel | content_tag (: й, hlabel) конца конца конца конца # конца content_tag стола возвращение content.html_safe end' –

ответ

0

Комплексное гнездование с помощью content_tag хелпер не является идеальным. Когда вы вставляете несколько экземпляров одного и того же тега HTML, будет отображаться только последний тег, поэтому необходимо объединить. Если вы рефакторинга, как это, ваш THEAD появится, как и ожидалось:

content_tag(:thead) do 
    headlabel = ["Header1","Header2"] 
    content_tag(:tr) do 
     headlabel.each do |hlabel| 
     concat(content_tag(:th, hlabel)) 
    end 
    end 
end 

Для того, чтобы упростить код и сделать его более удобным для чтения, я хотел бы предложить два варианта.

  1. Если данные в вашей таблице является простым, то есть он не содержит кучу условного кода, просто использовать стандартный Еврорадио частичный и сделать его по мере необходимости. Это более читаемо и так же полезно, как вспомогательный метод.

  2. Если ваш код сложный, с множеством условных обозначений и циклов. Создайте класс декоратора для своей модели. Самый быстрый способ - с draper gem, и это позволит вам написать свой стиль OOP-логики и сделать тестирование намного проще.

+0

Большое спасибо за подробный ответ. –

+0

Я проголосовал за это как ответ, так как он ответил на вопрос. Не знаю, почему это не видно. –

Смежные вопросы