Rails从presenter方法呈现部分集合

时间:2015-03-26 13:01:06

标签: html ruby-on-rails render presenter

我正在忙着观看铁道部演员,并希望重构我的一位演示者以包含页面模板。

我正在观看的截屏视频是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,而是作为一个已经转换为字符串的数组?

rendered on the page

我试着调用return s.join,但这只是在数组内部进行了什么操作并将其转换为字符串,但这会以相同的方式减去数组符号。

然后如何从演示者渲染部分内容以便在视图中显示为html?

2 个答案:

答案 0 :(得分:2)

似乎你应该将数组连接到字符串并调用html_safe

return s.join.html_safe

raw

= raw(uploads_presenter.display_faulty_uploads.join)

答案 1 :(得分:2)

我遇到了类似的问题,发现此答案很有帮助,因此想在这里分享我的发现。 我建议使用sanitize代替html_saferawhtml_saferaw都假设并标记您的html是安全的,而不需要对其进行实际验证,并且此行为可能导致XSS(跨站点脚本)漏洞。

可以here找到sanitize的更多详细信息。

这应该解决:

= sanitize(uploads_presenter.display_faulty_uploads.join)