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}};