Подтвердить что ты не робот

Использование помощников в rails 3 для вывода html

Я стараюсь построить помощника, который выводит < 'ul > , состоящий из всех членов коллекции. Для каждого члена коллекции я хочу напечатать файл < li, который имеет заголовок, и div ссылок на CRUD. Это очень похоже на то, что Rails выводит для подкладок для индексного представления.

Вот у меня есть помощник:

def display_all(collection_sym)
  collection = collection_sym.to_s.capitalize.singularize.constantize.all

  name = collection_sym.to_s.downcase

  html = '' 

  html << "<ul class=\"#{name}-list\">"

  for member in collection do
    html << content_tag(:li, :id => member.title.gsub(' ', '-').downcase.strip) do
     concat content_tag(:h1, member.title, :class => "#{name}-title")
     concat link_to 'Edit', "/#{name}/#{member.id}/edit"
     concat "\|"
     concat link_to 'View', "/#{name}/#{member.id}"
     concat "\|"
     concat button_to 'Delete', "/#{name}/#{member.id}", :confirm => 'Are you sure?  This cannot be undone.', :method => :delete
    end
   end

   html << '</ul>'

 return html
end 

И это выводит именно то, что я хочу. Прежде всего, если кто-то думает, что есть лучший способ сделать это, пожалуйста, не стесняйтесь меня исправить, я подозреваю, что я делаю это в бас-артах, но на данный момент это единственный способ, которым я знаю.

Затем я попытался обернуть ссылки в div следующим образом:

def display_all(collection_sym)
  collection = collection_sym.to_s.capitalize.singularize.constantize.all

  name = collection_sym.to_s.downcase

  html = '' 

  html << "<ul class=\"#{name}-list\">"

  for member in collection do
     html << content_tag(:li, :id => member.title.gsub(' ', '-').downcase.strip) do
     concat content_tag(:h1, member.title, :class => "#{name}-title")
     concat content_tag(:div, :class => "links-bar") do
       concat link_to 'Edit', "/#{name}/#{member.id}/edit"
       concat "\|"
       concat link_to 'View', "/#{name}/#{member.id}"
       concat "\|"
       concat button_to 'Delete', "/#{name}/#{member.id}", :confirm => 'Are you sure?  This cannot be undone.', :method => :delete
     end
   end
 end

 html << '</ul>'

 return html
end 

Однако теперь я больше не получаю никакой разметки внутри вывода div.links-bar для представления. Я уверен, что это должно иметь какое-то отношение к блоку и привязкам, но я могу на всю жизнь понять, что и как его исправить. Может ли кто-нибудь помочь?

4b9b3361

Ответ 1

Я согласен с комментарием выше, рекомендуя использовать частичное... но если вам нужно сделать это в помощнике, это более чистый способ реализации:

def display_all(collection)
  content_tag(:ul, class: "list") do
    collection.collect do |member|
      concat(content_tag(:li, id: member.name.gsub(' ', '-').downcase.strip) do
        member.name
      end)
    end
  end
end

Я бы передал в сборнике явно, а не передавал символ, чтобы создать коллекцию, поэтому вам не всегда нужно отображать ВСЕ записи в конкретной таблице одновременно. Вы можете добавить разбивку на страницы и т.д.

Ответ 2

@Joe, Вы все еще можете использовать свой метод display_all(collection_sym) Просто используйте: return html.html_safe вместо: return html

Я по-прежнему считаю, что во многих ситуациях лучше создавать HTML из помощников, а не использовать частичные. Таким образом, функция html_safe в Rails 3 гарантирует, что вы создадите HTML вместо преобразования в String.

Ответ 3

Как сообщает @TheDelChop, вам нужно concat для внутреннего content_tag, иначе выход будет просто <ul></ul>

Вот что это выглядит:

def display_all(collection)
  content_tag(:ul, :class => "list") do
    collection.collect do |member|
      concat(
        content_tag(:li, :id => member.name.gsub(' ', '-').downcase.strip) do
          member.name
        end
      )
    end
  end
end

Больше объяснений здесь: Вложение content_tag в Rails 3