2017-04-12 1 views
1

Comment analyser un hachage ruby ​​dans une balise <script> dans mon fichier index.html.erb?Analyser le hachage ruby ​​dans une balise script dans un fichier index.html.erb

Le contrôleur:

@full_calendar_options = { theme: true, header: { left: 'month,agendaWeek,agendaDay', center: 'title', right: 'prev,next' }, defaultView: 'agendaWeek', buttonIcons: { prev: 'calendar-left-arrow', next: 'calendar-right-arrow' } } 

Dans le index.html.erb, cela produirait javascript erreur de syntaxe:

<script> 
var options = <%= @full_calendar_options %>; 

Comme il produirait:

var options = {:theme=&gt;true, :header=&gt;{:left=&gt;&quot;month,agendaWeek,agendaDay&quot;, :center=&gt;&quot;title&quot;, :right=&gt;&quot;prev,next&quot;} ... 

Quand je envelopper la capture de rubis avec une chaîne, je ne reçois aucune erreur:

var options = '<%= @full_calendar_options %>'; 

Mais il produit:

var options = '{:theme=&gt;true, :header=&gt;{:left=&gt;&quot;month,agendaWeek,agendaDay&quot;, :center=&gt;&quot;title&quot;, :right=&gt;&quot;prev,next&quot;}, ... 

qui est une chaîne codée. Ce n'est pas JSON, donc je ne peux pas l'analyser en un littéral d'objet. J'essaie d'obtenir l'objet littéral en JavaScript. Quel est le meilleur moyen d'y parvenir?

Répondre

0

Vous voulez probablement cette sortie vers JSON, car il semble que vous l'attribuez à une variable JavaScript. Dans ce cas:

var options = <%= @full_calendar_options.to_json %> 
+0

Pourquoi dois-je utiliser inspecter aussi? Pourquoi to_json ne fonctionnerait-il pas? – Donato

+0

Oups, vous avez raison. 'to_json' fonctionnera correctement sans' inspect'. –

+1

Je pense que html_safe pourrait aussi être requis: @ full_calendar_options.to_json.html_safe – Donato

1
<script> 
var options = <%= raw @full_calendar_options.to_json %>; 
+0

Par curiosité, pourquoi Rails échappe-t-il aux données par défaut? N'est-ce pas un inconvénient? Qui voudrait des données qui ressemblent à ceci? {: theme = > true,: header = > – Donato

+0

Ceci est une bonne explication pourquoi: http://yehudakatz.com/2010/02/01/safebuffers-and-rails-3-0/ Fondamentalement parce que quoi que ce soit au sein de <%= %> peut être entrée utilisateur dangereuse, y compris javascript malicieux de sorte qu'il échappe par défaut afin de ne pas être malveillant. – Donato