web-dev-qa-db-fra.com

ruby à l'intérieur du bloc javascript [modèle mince]

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

32
norman784

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.

32
aross

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}]) }};
20
fphilipe

Vous avez 2 options:

1. Utilisez une section 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};

2. Utilisez des accolades doubles

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