template style rails programming language framework example ruby slim-lang

style - ruby dentro del bloque javascript



slim programming language (3)

¿Hay una manera de poner condiciones ruby ​​dentro del bloque javascript? es decir

javascript: var config = { common_value_1 : 1, common_value_2 : 2 }; - if my_value === true # this must be a ruby condition config.custom_true_value_1 = "1" ; config.custom_true_value_2 = "#{my_value}" ; - else config.custom_false_value_1 = "1" ; config.custom_false_value_2 = "#{my_value}" ;

¿O hay otra solución a este problema? Porque la forma fea en que puedo usar es:

javascript: var config = { common_value_1 : 1, common_value_2 : 2 }; - if my_value === true # this must be a ruby condition javascript: config.custom_true_value_1 = "1" ; config.custom_true_value_2 = "#{my_value}" ; - else javascript: config.custom_false_value_1 = "1" ; config.custom_false_value_2 = "#{my_value}" ;

Pero no me gusta porque si config tiene valores comunes entre si y si no, duplicaría mi código y sería mucho más grande y difícil de mantener.

Actualizado con mejores ejemplos.


En Slim puro no tienes raw ni html_safe . En esos casos, simplemente use llaves dobles como se documenta here :

javascript: var data = #{{ JSON.dump([{x: 1, y:2}]) }};


Puedes usar un estilo similar a la interpolación de cadenas. Vea el ejemplo a continuación.

javascript: var config = { custom: "#{my_value ? ''truthy'' : ''falsy''}", current_user: #{raw current_user.to_json} };

** Actualizar abajo **

Si desea una configuración más avanzada, recomendaría crear una clase, por ejemplo

class ClientConfig attr_accessor :foo, :bar # .. code def to_json { foo: foo, bar: bar }.to_json end end # in view file javascript: var config = ClientConfig.new.to_json

Si no, también tienes la oportunidad de crear un rubí parcial. He creado un ejemplo a continuación que puede que no sea tan hermoso, pero yo trabajo.

# template_path/_config.html.ruby def configuration { foo: "Hello", bar: "World" } end def july_special { june_key: "It''s June" } end def month_name Date.today.strftime("%B") end config = month_name == ''July'' ? configuration.merge(july_special) : configuration content_tag :script, config.to_json.html_safe # viewfile = render ''template_path/config''

Así que mi punto es que hay varias formas de hacer esto y deberías tratar de encontrar la forma que más se adapte a ti y a tu aplicación. En mi caso, usaría mi primer ejemplo (antes de la actualización) si solo necesitara uno o dos valores, de lo contrario, iría a la clase ClientConfig .


Tienes 2 opciones:

1. Use una sección de ruby

Este escenario es mejor para código complejo.

Tengo un objeto de rubí que quiero hacer un JSON. Entonces, dentro de mi archivo delgado crearé una sección de ruby :

ruby: myObject = @object.to_json.html_safe

Preste atención a html_safe : es importante no escapar de las comillas dobles.

Entonces puedes usar myObject dentro de la sección javascript :

javascript: var data = #{myObject};

2. Utilice llaves dobles

Para casos simples, use llaves dobles dentro de la sección de javascript , como se indica en la respuesta de @filipe:

javascript: var data = #{{@object.to_json}};