вложенная таблица конструирования content_tag - PullRequest
2 голосов
/ 07 апреля 2011

Я застрял ...

Я пытаюсь создать помощник таблиц в моем помощнике приложений, как это:

def simple_grid(theGrid, theData)
    content_tag :div, :class => "text_area_show" do
      content_tag :table, :width => "95%" do
        concat content_tag :tr, "" do
          theGrid['fields'].each do |field|
            concat content_tag(:th, field)
          end
        end
        theData.collect do |record|
          concat content_tag :tr do
            theGrid['fields'].collect do |field|
              concat content_tag(:td, record[field], :align => "center")
            end
          theGrid['right_links'].collect do |right_link,path|
            case right_link
            when 'show'
              concat content_tag(:td, link_to(right_link, "#{path}#{record.id}"), :align => "center")
            when 'edit'
              concat content_tag(:td, link_to(right_link, "#{path}#{record.id}/edit"), :align => "center")
            end
          end
        end
      end
    end
  end
  end

с этим в моем контроллере:

  @users = User.all
    @grid = {'fields' => ['firstname','lastname','email'],
             'right_links' => {'show' => '/admin/users/', 'edit' => '/admin/users/'}
    }

И это на мой взгляд:

<%= simple_grid(@grid, @users) %>

Это приводит к следующему html:

<div class="text_area_show"><table width="95%"><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr></table></div>

Я скучаю по всем моим тегам td.

Любойпомогите рассказать, что не так, будем очень признательны!

Николас.

Ответы [ 3 ]

1 голос
/ 07 апреля 2011

Это то, что я сделал в первую очередь, но, будучи новичком в Rails, я пытаюсь представить путь Rails ...

Лучшее решение, которое я нашел до сих пор:

  def simple_grid(theGrid, theData)
    content_tag :div, :class => "text_area_show" do
      concat(content_tag(:table, :width => "95%") do
         concat(content_tag(:tr) do
          theGrid['fields'].collect do |field|
            concat(content_tag(:th, field))
          end
        end)
        theData.collect do |record|
          concat(content_tag(:tr) do
            theGrid['fields'].collect do |field|
              concat(content_tag(:td, record[field], :align => "center"))
            end
            theGrid['right_links'].collect do |right_link,path|
              case right_link
              when 'show'
                concat(content_tag(:td, link_to(right_link, "#{path}#{record.id}"), :align => "center"))
              when 'edit'
                concat(content_tag(:td, link_to(right_link, "#{path}#{record.id}/edit"), :align => "center"))
              end
            end
          end)
        end
      end)
    end
  end

Это довольно уродливо, но работает.Любые предложения по улучшению работы приветствуются!

1 голос
/ 02 января 2013

content_tag подходит только для простых помощников. Для сложных помощников гораздо лучше использовать частичное:

 def simple_grid( grid, data )
   render partial: '/shared/simple_grid', locals: { grid: grid, data: data }
 end

, чтобы вы могли воспользоваться вашим любимым движком шаблонов. Обратите внимание, что я обычно храню такие партиалы в «общей» папке в «app / views», но решать вам. Помощник в этом случае даже не обязателен, но он может быть полезен в тех случаях, когда вам нужно обработать данные перед рендерингом.

Другим подходом может быть шаблон декоратора (с использованием Draper gem ), но это уже другая тема.

0 голосов
/ 07 апреля 2011

Был кошмар времени, пытавшегося решить вашу проблему из-за нескольких тегов content_for. Прочитайте в документации по API, что вам нужно всегда использовать .collect вместо .each и что для нескольких тегов content_for в блоке вам нужно использовать concat ... но, как я мог бы, я тоже не могу заставить его работать ...

В крайнем случае вы всегда можете вернуться к:

@output = "<div class='text_area_show'>
    <table width='95%'>
      <tr>"
theGrid['fields'].each { |field| @output += "<th>#{field}</th>"}
@output += "</tr>"

theData.collect do |record|
   @output += "<tr>"
      theGrid['fields'].each { |field| @output += "<td align='center'>#{record[field]}</td>"}

      theGrid['right_links'].collect do |right_link,path|
        case right_link
        when 'show'
          @output += "<td align='center'>#{link_to(right_link, "#{path}#{record.id}")}</td>"
        when 'edit'
          @output += "<td align='center'>#{link_to(right_link, "#{path}#{record.id}/edit")}</td>"
        end
      end
   @output += "</tr>"
end

@output += "</table></div>"
@output
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...