Я сгенерировал хэш в декораторе Rails 5 и хочу сделать его доступным в моем представлении в виде атрибута html, чтобы его можно было использовать для веб-компонента javascript.
class EnhancedObjectMediaItemDecorator < Draper::Decorator
....
def lightbox_data
hash = {"museumNumber" => enhanced_object.museum_number,
"copyright" => copyright,
"onDisplay" => enhanced_object.on_display,
"locationSite" => enhanced_object.site,
"locationRoom" => lightbox_room}
end
У меня естьпытался сделать множество способов избежать этого в представлении erb, но я не уверен, что могу подходить к этому правильно, так как я ожидаю, что требование показывать json в представлении будет довольно распространенным явлением.
I 'Мы использовали этот вопрос Встраивание JSON в шаблон JS / ERB для Rails 4 , чтобы помочь мне сгенерировать некоторые опции для экранирования.
В фрагментах кода ниже я сначала показываю фрагмент кода из моего erbview и атрибут data-lightbox извлекается из источника страницы.
только для to_json
Похоже, что для рендеринга хеша используются html-сущности:
data-lightbox= "<%= media_item.lightbox_data.to_json %>"
=>
data-lightbox= "{"museumNumber":"Gestetner 251","copyright":"© whatapalaver, London","onDisplay":true,"locationSite":"","locationRoom":"Art Library corridor"}"
raw
data-lightbox= "<%= raw media_item.lightbox_data.to_json %>"
=>
data-lightbox= "{"museumNumber":"Gestetner 251","copyright":"© whatapalaver, London","onDisplay":true,"locationSite":"","locationRoom":"Art Library corridor"}"
json_escape
Это похоже на запуск to_только json.
data-lightbox= "<%= json_escape media_item.lightbox_data.to_json %>"
=>
data-lightbox= "{"museumNumber":"Gestetner 251","copyright":"© whatapalaver, London","onDisplay":true,"locationSite":"","locationRoom":"Art Library corridor"}"
escape_javascript
data-lightbox= "<%= escape_javascript media_item.lightbox_data.to_json %>"
=>
data-lightbox= "{\"museumNumber\":\"Gestetner 251\",\"copyright\":\"© whatapalaver, London\",\"onDisplay\":true,\"locationSite\":\"\",\"locationRoom\":\"Art Library corridor\"}"
escape_javascript и raw
data-lightbox= "<%= escape_javascript raw media_item.lightbox_data.to_json %>"
=>
data-lightbox= "{\"museumNumber\":\"Gestetner 251\",\"copyright\":\"© whatapalaver, London\",\"onDisplay\":true,\"locationSite\":\"\",\"locationRoom\":\"Art Library corridor\"}"
Я хотел бы понять различные варианты использования для этих многих параметров экранирования, и каков наилучший способ представления JSON для веб-компонента?