2011-11-13 11 views
48

Mam kontroler Rails, w którym ja się ustawienie zmiennej instancji -Jak uzyskać dostęp do zmiennych instancji w silniku coffeescript wewnątrz Slim szablonu

@user_name = "Some Username" 

W moim .slim szablonie używam silnika kawy i wygenerować javascript aby wydrukować nazwę użytkownika od klienta-sie kodu JavaScript -

coffee: 
    $(document).ready -> 
    name = "#{@user_name}" 
    alert name 

ale jest to skrypt, który jest generowany ??

$(document).ready(function() { 
    var name; 
    name = "" + this.my_name; 
    alert(name); 
} 

Jak uzyskać dostęp do zmiennych instancji kontrolera w moim kodu coffeescript ??

Oznaczam to jako haml, ponieważ przypuszczam, że haml będzie miał ten sam problem podczas używania CoffeeScript.

+1

@Thilo Nie, on próbuje wstrzyknąć zmienną Ruby '@ user_name'. Ruby i CoffeeScript używają tej samej składni interpolacji napisów. –

+1

Rozumiem. BTW, jak to się dzieje, że nazwa zmiennej zmienia się z '" # {@ nazwa_użytkownika} " ' to' this.my_name'? – Thilo

+0

Ponieważ w coffeescript, @prop zostanie skompilowany do this.prop –

Odpowiedz

86

Co się dzieje, że "#{@user_name}" jest interpretowany jako CoffeeScript, a nie jako kod Ruby, który jest oceniany i wstrzykiwany do źródła CoffeeScript. Pytasz: "Jak wstrzyknąć zmienną Ruby do mojego źródła CoffeeScript?"

Krótka odpowiedź brzmi: Nie rób tego. Zespół Railsów podjął świadomą decyzję, by nie obsługiwać osadzonego kodu kawy w szablonach w wersji 3.1, ponieważ istnieje znaczna poprawa wydajności w związku z koniecznością kompilowania kodu CoffeeScript przy każdym żądaniu (tak jak byś zrobił, gdybyś zezwalał na wstrzykiwanie dowolnych łańcuchów do źródła) .

Moja rada jest, aby służyć zmienne Ruby oddzielnie jako czystego JavaScript, a następnie odwołać te zmienne z coffeescript, np .:

javascript: 
    user_name = "#{@user_name}"; 
coffee: 
    $(document).ready -> 
    name = user_name 
    alert name 
+0

dzięki za odpowiedź, więc w zasadzie to, co zasugerowałeś, jest w porządku z punktu widzenia wydajności? – kapso

+2

To zależy od tego, czy Slim rekompiluje CoffeeScript w szablonie na każde żądanie. Naprawdę nie jestem pewien. Prawdopodobnie powinieneś przenieść go do zewnętrznego pliku; to zostanie skompilowane tylko do JS raz, a przeglądarki będą je buforować. –

30

staram się unikać inline JavaScript za wszelką cenę.

Dobrym sposobem na przechowywanie zmiennych w kodzie HTML, do wykorzystania w javascript, jest użycie atrybutów danych HTML5. Jest to idealne rozwiązanie, aby zachować dyskretność javascript.

+0

Nie byłoby to przydatne, jeśli używasz MVC JavaScript i chcesz uniknąć wysyłania wielu żądań HTTP do serwera. http://backbonejs.org/#FAQ-bootstrap – jackyalcine

+0

Jeśli korzystasz z javascript MVC, w większości robisz zapytania ajaxowe, aby uzyskać dane i renderujesz kod HTML na kliencie. Ale na przykład ogólne parametry konfiguracyjne, które można nadal wysłać w atrybutach danych w html/body/container. – nathanvda

+0

To prawda, prawda.Przepraszam, jeśli zszedłem bardzo pochopnie! – jackyalcine

2

Można również użyć:

$(document).ready -> 
    name = <%= JSON.generate @user_name %> 
    alert name 

To dlatego JSON jest podzbiorem JavaScript.

+1

To ciężkie barfs. Lub przynajmniej w wewnętrznych plikach .coffee. –