Как внедрить хэш JSON в качестве значения атрибута в представление erb Rails - PullRequest
0 голосов
/ 19 июня 2019

Я сгенерировал хэш в декораторе 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= "{&quot;museumNumber&quot;:&quot;Gestetner 251&quot;,&quot;copyright&quot;:&quot;© whatapalaver, London&quot;,&quot;onDisplay&quot;:true,&quot;locationSite&quot;:&quot;&quot;,&quot;locationRoom&quot;:&quot;Art Library corridor&quot;}"

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= "{&quot;museumNumber&quot;:&quot;Gestetner 251&quot;,&quot;copyright&quot;:&quot;© whatapalaver, London&quot;,&quot;onDisplay&quot;:true,&quot;locationSite&quot;:&quot;&quot;,&quot;locationRoom&quot;:&quot;Art Library corridor&quot;}"

escape_javascript

data-lightbox= "<%= escape_javascript media_item.lightbox_data.to_json %>"

=>

data-lightbox= "{\&quot;museumNumber\&quot;:\&quot;Gestetner 251\&quot;,\&quot;copyright\&quot;:\&quot;© whatapalaver, London\&quot;,\&quot;onDisplay\&quot;:true,\&quot;locationSite\&quot;:\&quot;\&quot;,\&quot;locationRoom\&quot;:\&quot;Art Library corridor\&quot;}"

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 для веб-компонента?

...