Rails визуализирует коллекцию партиалов из метода презентатора

Я занят просмотром трансляций Rail на докладчиках и хотел бы реорганизовать одного из своих докладчиков, чтобы включить шаблон страницы.

Скринкаст, который я смотрел, называется 287-presenters-from-scratch

Я инициализировал докладчика так, как он предложил, и создал вспомогательный метод в вспомогательном файле приложений.

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

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

- present_upload(host, current_account, current_user, context) do |uploads_presenter|
  .pending_uploads
    = uploads_presenter.display_pending_uploads 

  .faulty_uploads
    = uploads_presenter.display_faulty_uploads

  .corrupt_uploads    
    = uploads_presenter.display_corrupt_uploads

  .completed_uploads
    = uploads_presenter.display_complete_uploads

  .successful_uploads
    = uploads_presenter.display_successful_uploads

Пример от ведущего

class UploadsPresenter 
  attr_reader :host, :user, :account, :context

  def initialize(host, current_account, user, context, template)
    @host = host
    @user = user
    @account = current_account
    @context = context
    @template = template
  end

  def h
    @template
  end

  def display_pending_uploads
    return unless uploads_pending?
    s = []
    pending_uploads.each do |upload|
      s << h.render(partial: 'upload/pending_upload', locals: {upload: upload})
    end
    return s
  end

  def display_complete_uploads
    return unless uploads_complete?
    s = []
    completed_uploads.each do |upload|
      s << h.render(partial: 'upload/complete_upload', locals: {upload: upload})
    end
    return s
  end

  ...
end

Только это отображается на странице.. это не преобразование его в читаемый html, а как массив, который был преобразован в строку ??

отображается на странице

я пытался вызвать return s.join, но это просто берет то, что находится внутри массива, и преобразует его в строку, но это отображается так же, за исключением символов массива.

как затем отображать частичные фрагменты из ведущего, чтобы они отображались как html в представлении?


person TheLegend    schedule 26.03.2015    source источник


Ответы (2)


Похоже, вы должны соединить массив со строкой и вызвать html_safe:

return s.join.html_safe

или raw:

= raw(uploads_presenter.display_faulty_uploads.join)
person Maxim    schedule 26.03.2015
comment
Большое спасибо! это именно то, что я искал. сырой метод довольно удивительным! - person TheLegend; 26.03.2015

Я столкнулся с похожей проблемой и нашел этот ответ полезным, поэтому хотел поделиться своими выводами здесь. Я предлагаю использовать sanitize вместо html_safe или raw. И html_safe, и raw предполагают и помечают ваш html как безопасный, фактически не проверяя их, и такое поведение может привести к уязвимостям XSS (межсайтовый скриптинг).

Более подробную информацию о sanitize можно найти здесь.

Просто это должно решить:

= sanitize(uploads_presenter.display_faulty_uploads.join)
person cosmo10    schedule 18.08.2019