2013-07-22 15 views
22

C'è un modo per mettere le condizioni ruby ​​all'interno del blocco javascript? Ad esempioruby ​​all'interno del blocco javascript [modello sottile]

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

Oppure c'è un altro modo per risolvere questo problema? Perché il modo brutto che posso usare la sua:

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

Ma non mi piace perché se config ha valori comuni tra se e il resto poi vorrei duplicare il mio codice e sarebbe molto più grande e difficile da mantenere.

aggiornato con esempi migliori

+0

perché la parte if-else assegna gli stessi valori? va bene? –

+1

Provare contro il vero letterale è una cosa strana da fare. Perché "se my_value" non è sufficiente? – tadman

+0

Non me lo spiego bene, guardate la domanda aggiornata, grazie ... – norman784

risposta

26

È possibile utilizzare uno stile simile a interpolare stringa. Se esempio qui sotto.

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

** Aggiornamento ** sotto

Se si desidera una configurazione più avanzata vi consiglio di creare una classe, ad esempio

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 

Else avete anche la possibilità di creare un rubino parziale Ho creato un esempio qui sotto che potrebbe non essere così bello ma io lavoro.

# 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' 

Quindi il mio punto è che theres moltiplicano modi di fare questo e si dovrebbe cercare di trovare il modo in cui questo è suite di voi e la vostra applicazione di più. Nel mio caso avrei usato il mio primo esempio (prima che l'aggiornamento), se ho solo bisogno di uno o due valori altra cosa vorrei andare per la classe ClientConfig

+0

cosa dire se voglio aggiungere chiavi diverse in ogni caso, aggiorno la mia domanda, sembra che io non spieghi bene il primo tempo – norman784

+0

Se risposta aggiornata per alcune altre alternative. – aross

+0

mi sembra giusto ... grazie ... – norman784

12

In puro Slim non si dispone di rawhtml_safe. In questi casi, è sufficiente utilizzare doppie parentesi graffe come documentato here:

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

Questa è la risposta più semplice e precisa. –

3

hai 2 opzioni:

1. Usare un ruby sezione

Questo scenario è meglio per codice complesso.

Ho un oggetto rubino che voglio creare un JSON. Così, dentro la mia lima sottile creerò una sezione ruby:

ruby: 

    myObject = @object.to_json.html_safe 

Prestare attenzione al html_safe: è importante non sfuggire le virgolette doppie.

Quindi è possibile utilizzare myObject all'interno javascript sezione:

javascript: 

    var data = #{myObject}; 

2. Usare doppie parentesi graffe

Per i casi semplici, utilizzare le doppie parentesi graffe all'interno della sezione javascript, come indicato nella risposta @fphilipe :

javascript: 

    var data = #{{@object.to_json}}; 
+1

Mi chiedo che sia così difficile da trovare su internet. Grazie a @rael. –

Problemi correlati