我正在忙着观看铁道部演员,并希望重构我的一位演示者以包含页面模板。
我正在观看的截屏视频是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?
答案 0 :(得分:2)
似乎你应该将数组连接到字符串并调用html_safe
:
return s.join.html_safe
或raw:
= raw(uploads_presenter.display_faulty_uploads.join)
答案 1 :(得分:2)
我遇到了类似的问题,发现此答案很有帮助,因此想在这里分享我的发现。
我建议使用sanitize
代替html_safe
或raw
。 html_safe
和raw
都假设并标记您的html是安全的,而不需要对其进行实际验证,并且此行为可能导致XSS(跨站点脚本)漏洞。
可以here找到sanitize
的更多详细信息。
这应该解决:
= sanitize(uploads_presenter.display_faulty_uploads.join)