2013-07-22 27 views
22

Istnieje sposób na umieszczenie warunków ruby ​​wewnątrz bloku javascript? tj.ruby ​​wewnątrz bloku javascript [wąski szablon]

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

Czy istnieje inne obejście tego problemu? Ponieważ brzydki sposób, że można używać jej:

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

Ale nie podoba mi się to, bo jeśli config ma wspólnych wartości pomiędzy wtedy i jeszcze potem chciałbym powielać mojego kodu i byłyby znacznie większe i trudne do utrzymania.

Aktualizacja z lepszych przykładów

+0

Dlaczego część "else" przypisuje te same wartości? czy to jest w porządku? –

+1

Testowanie z literalnym prawdziwym jest dziwną rzeczą do zrobienia. Dlaczego "moja wartość" nie jest wystarczająca? – tadman

+0

Po prostu nie wyjaśnię dobrze siebie, spójrz na zaktualizowane pytanie, dziękuję ... – norman784

Odpowiedz

26

można użyć stylu podobnym do strun interpolować. Se przykład poniżej.

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

** Aktualizacja poniżej **

Jeśli chcesz bardziej zaawansowaną konfigurację polecam, aby utworzyć klasę, na przykład

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 masz również możliwość tworzenia ruby partial Stworzyłem przykład poniżej, który może nie jest tak piękny, ale pracuję.

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

Więc chodzi mi o to, że Theres pomnożyć sposoby robienia tego i należy starać się znaleźć sposób ów pakiet Ty i Twoja aplikacja najbardziej. W moim przypadku użyłbym mój pierwszy przykład (przed aktualizacją) jeśli wystarczy jeden lub dwa inne wartości i pójdzie do klasy ClientConfig

+0

co jeśli chcę dodać różne klucze w każdym przypadku, aktualizuję moje pytanie, wydaje się, że nie wyjaśniam dobrze siebie czas – norman784

+0

Se zaktualizowaną odpowiedź dla niektórych więcej alternatyw. – aross

+0

wydaje mi się sprawiedliwe ... dzięki ... – norman784

12

w czystej Slim nie masz raw ani html_safe. W tych przypadkach, wystarczy użyć podwójnych nawiasów klamrowych jak udokumentowano here:

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

To jest najprostsza i najdokładniejsza odpowiedź. –

3

masz 2 opcje:

1. Użyć ruby sekcja

Ten scenariusz jest lepszy dla skomplikowanego kodu.

Mam obiekt ruby, który chcę utworzyć JSON. Tak więc, w mojej smukłej pliku będę tworzyć ruby rozdział:

ruby: 

    myObject = @object.to_json.html_safe 

zwrócić uwagę na html_safe: ważne jest, aby nie uciec cudzysłów.

Następnie można użyć myObject wewnątrz javascript odcinku:

javascript: 

    var data = #{myObject}; 

2. Korzystanie podwójne nawiasy klamrowe

W prostych przypadkach, należy użyć podwójnych nawiasów klamrowych wewnątrz sekcji javascript, jak stwierdzono w @fphilipe odpowiedź :

javascript: 

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

Zastanawiam się, że tak trudno jest znaleźć w Internecie. Dzięki @rael. –