Page 123 of 165

Rails 3.0.1 na 3.0.2 i I18n oraz problemy z modułami

Przechodząc z Rails 3.0.1 na 3.0.2 umknęła mi jedna rzecz. Nikt nigdzie nie wspomniał o tym, że zmianie ulega sposób budowania tłumaczeń dla I18n.

O ile zmiana na pola defaultowe, jest całkiem fajna (a i tak ją stosowałem dawniej, przy pomocy pewnego "hacka" ;) ), o tyle zmiany odnośnie klas w modułach, przyprawiły mnie o 25 minutowe wkurzenie.

Zanim jednak do tego przejdziemy, wspomnę o tej fajniejszej zmianie. Otóż dawniej, kiedy chcieliśmy przetłumaczyć nazwy atrybutów z różnych modeli, musieliśmy (stosowanie tricków się nie liczy) wypisywać wszystkie atrybuty dla wszystkich modeli. Kończyło się to sytuację gdzie np. pole "Imię" dla modeli User i Admin było tłumaczone tak:

activerecord:
    models:
      user: Użyszkodnik
      admin: Bóg
    attributes:
      user:
         name: Imię
      admin:
         name: Imię

było to trochę niewygodne. W nowym I18n, możemy zrobić to tak:

attributes:
   name: Imię

Oczywiście jeśli mamy model gdzie "name" to np. nazwa firmy, możemy wciąż dla tego wyjątku, dopisać całość w węźle Activerecord.

Druga zmiana też jest dobra, jednak trochę niespodziewana (a przynajmniej niezapowiedziana). Dawniej, polonizując modele w modułach, robiło się to tak(przykład dla klasy Profile::Admin):

activerecord:
    models:
      "profile/base": Profil
    attributes:
      "profile/admin":
        views: Ilość odwiedzin
        name: Imię
        surname: Nazwisko
        city: Miasto

jak widać powyżej, kiedy mieliśmy do czynienia z klasą w module, postępowaliśmy wg. schematu: moduł/model.

Nadeszło nowe i lepsze (ale cholerka, mogli powiadomić!). Od teraz moduł będzie stanowił gałąź-rodzica w pliku translacji, tak jak w poniższym przykładzie:

activerecord:
    models:
      profile:
         base: Profil
    attributes:
      profile:
         admin:
           views: Ilość odwiedzin
           name: Imię
           surname: Nazwisko
           city: Miasto

Takie zagnieżdżanie jest dużo wygodniejsze :)

Jednolinijkowe rekurencyjne wywołanie w Rubym

Siedząc dzisiaj na wykopie, natrafiłem na wątek, gdzie pewien Pan chciał wyrazić swoje niezadowolenie z racji tego, że ten link już był. Zrobił to tak:

#include <iostream>
using namespace std;
int main() {
int l;
for (l=1;l<1000;++l) {
cout <<"Było!! "<<endl;
}
return 0;
} 

Pomysł fajny, nie powiem. Ale można prościej!

1000.times { p "Było!" }

Można też tak (wersja w PHP - autor LostHighway):

function Go($i) { if($i) return Go($i-1).' Było!!'; }
echo Go(1000); 

Uważniejsi zauważą że powyższy kod, jest kodem bezpętlowym. 1000krotne wywołanie następuje dzięki rekurencji.

Nie byłbym sobą, gdybym nie postanowił napisać tego w jednej linijce w Rubym :)

lambda {|a, x| "Bylo! #{a.call(a, x-1)}" if x > 0}.tap{ |r| p r.call(r, 1000)}

Działanie tego kodu jest bardzo proste.

Najpierw tworzymy funkcję anonimową (to co w klamerkach po lambda). Funkcja ta jest funkcją rekurencyjną, która przyjmuje dwa parametry: kod do wykonania (w postaci obiektu typu Proc) oraz licznik.

Następnie korzystam z metody tap która wywołuje taką funkcję anonimową, dzięki czemu mogę ją odpalić :)

Przykład ten doskonale ilustruje zarówno to jak Ruby jest zwięzły, jak i możliwości korzystania z funkcji anonimowych.

Copyright © 2024 Closer to Code

Theme by Anders NorenUp ↑