Il existe un moyen de mettre des conditions Ruby à l'intérieur du bloc javascript? I.e.
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}" ;
Ou existe-t-il une autre solution à ce problème? Parce que la façon laide que je peux utiliser son:
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}" ;
Mais je ne l'aime pas parce que si config a des valeurs communes entre if et else, je dupliquerais mon code et serait beaucoup plus volumineux et difficile à maintenir.
mis à jour avec de meilleurs exemples
Vous pouvez utiliser un style similaire à l'interpolation de chaînes. Voir l'exemple ci-dessous.
javascript:
var config = {
custom: "#{my_value ? 'truthy' : 'falsy'}",
current_user: #{raw current_user.to_json}
};
** Mise à jour ci-dessous **
Si vous voulez une configuration plus avancée, je recommanderais de créer une classe, par exemple
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
Sinon, vous avez également la possibilité de créer un Ruby partial J'ai créé un exemple ci-dessous qui n'est peut-être pas si beau mais je travaille.
# 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'
Donc, mon point de vue est qu'il y a plusieurs façons de le faire et vous devriez essayer de trouver celle qui vous convient le mieux et votre application. Dans mon cas, j'utiliserais mon premier exemple (avant la mise à jour) si je n'ai besoin que d'une ou deux valeurs, je choisirais la classe ClientConfig
.
Dans Pure Slim, vous n'avez ni raw
ni html_safe
. Dans ces cas, utilisez simplement des accolades doubles comme indiqué ici :
javascript:
var data = #{{ JSON.dump([{x: 1, y:2}]) }};
Vous avez 2 options:
Ruby
Ce scénario est préférable pour le code complexe.
J'ai un Ruby objet que je veux faire un JSON. Donc, à l'intérieur de mon fichier slim, je vais créer une section Ruby
:
Ruby:
myObject = @object.to_json.html_safe
Faire attention à html_safe
: il est important de ne pas échapper aux guillemets doubles.
Ensuite, vous pouvez utiliser myObject
dans la section javascript
:
javascript:
var data = #{myObject};
Pour les cas simples, utilisez les accolades doubles à l'intérieur de la section javascript
, comme indiqué dans la réponse @fphilipe:
javascript:
var data = #{{@object.to_json}};