sobota, 26 marca 2011

Ikonki, paski, klepsydry - wszystko o czekaniu (waiting icons)

W każdej aplikacji webowej potrzeba animowanych elementów przedstawiających proces ładowania. Albo potrzeba ikon, które nie mówią nic o procesie ładowania poza enigmatycznym zapewnieniem, że jakoweś tajne informacje przetwarzane są po stronie serwera.
Na tej stronce mamy wybór: http://mentalized.net/activity-indicators/

piątek, 25 marca 2011

Kilka sztuczek w modelach Ruby on Rails

Przedstawiam kilka ciekawych "chwytów" dla modeli w Ruby on Rails. Dla jednych bardzo odkrywcze, a dla innych może już nie.

Polskie nazwy dla atrybutów

Rails z "automatu" fajnie wyświetla błędy dla modelu. Fajnie tylko pod warunkiem, że się spolonizowało aplikację. Pozostało oczywiście to, że atrybuty wyświetlają się nadal w swojej oryginalnej formie.
Jest na to rada. Umieszczamy to w modelu:
HUMANIZED_ATTRIBUTES = {
  :last_name => "Nazwisko",
  :first_name => "Imię",
  .
  .
  .
  :gender => "Płeć"
}
def self.human_attribute_name(attr)
  HUMANIZED_ATTRIBUTES[attr.to_sym] || super
end
No i już wszędzie pojawi się zamiast "last_name" napis "Nazwisko".

Walidacje dla grupy atrybutów (pól)

Załóżmy, że mamy kilka pól dla których należy nanieść ograniczenie. Warto zbudować dla nich stałą, aby później (po latach) zmieniając kod aplikacji rozumieć co artysta (ja) miał na myśli :-)
Mogłoby to wyglądać mniej więcej tak:
class DayPayment < ActiveRecord::Base
  SHORT_FIELD_LENGHT = 4 
  SHORT_FIELDS = %w(morning afternoon midnight)
  .
  .
  .
  validates_lenght_of SHORT_FIELDS, :maximum => SHORT_FIELD_LENGHT
  .
  .
  .
end 


Proste typy wyliczeniowe wymagane w polach

Załóżmy, że chcielibyśmy aby w bazie zapisywana była płeć użytkownika w formacie tekstowym jako "mężczyzna" albo "kobieta". Możemy to zrobić tak:
class User < ActiveRecord::Base
  VALID_GENDERS = ["mężczyzna", "kobieta"]
  .
  .
  .
  validates_inclusion_of :gender,
                         :in => VALID_GENDERS,
                         :allow_nil => true,
                         :message => 'tylko "mężczyzna" albo "kobieta"'
  .
  .
  .
end
opis:
VALID_GENDERS -  jak zwykle wykorzystywanie stałych, aby później rozumieć co się pisało;
:allow_nil => true - bo użytkownik nie musi wypełniać pola "płeć";

Wykorzystanie zakresu jako ograniczenia

Ruby udostępnia przejrzysty w swej składni i bardzo prosty w użyciu system zakresów. Można go użyć w modelu na przykład do ograniczenia wprowadzanych dat. Wejdą wtedy tylko te akceptowane. Można to zrobić na przykład tak:

class User < ActiveRecord::Base
  YEAR_FROM = 1939
  VALID_DATES = DateTime.new(YEAR_FROM)..DateTime.now
  .
  .
  .
  validates_inclusion_of :birth_date,
                         :in => VALID_DATES,
                         :allow_nil => true,
                         :message => "jest nieprawidłowa"
  .
  .
  .
end
opis:
VALID_DATES - zakres dopuszczalnych dat
:allow_nil => true - bo użytkownik nie musi wypełniać daty

Więcej informacji w książce Hartla i Prohazki "RailsSpace".

Ciekawy artykuł - stronicowanie, sortowanie tabel w Ruby on Rails

Stronicowanie i sortowanie tabel to bardzo popularne zagadnienie w każdej aplikacji webowej, czyli również w Rails. Dodatkowo autor porusza problem wyszukiwania w tabelach.
Całość artykułu znajduje się pod adresem:
http://dev.nozav.org/rails_ajax_table.html

środa, 23 marca 2011

Jak w jQuery wywołać funkcję z parametrami

JQuery w bardzo wielu miejscach używa funkcji bezimiennej jako parametru.
Na przykład jeśli chcemy zareagować na zmianę w polu "#name":
jQuery("#name").change(function(){
  //tu jakieś operacje
});
Wszystko fajnie do momentu, gdy te wewnętrzne funkcje nie zaczynają się rozrastać i ciągnąć za sobą nowe funkcje. Kod staje się całkowicie nieczytelny i bałagan z każdą chwilą się pogłębia.
Częściowym rozwiązaniem jest osadzanie funkcji nazwanych jako parametru.
W poprzednim przykładzie funkcję bezimienną moglibyśmy zastąpić nazwaną, jak choćby:
function makeChanges() {
  //tu kod z funkcji nienazwanej
}
którą osadzamy w poprzednim przykładzie:
jQuery("#name").change(makeChanges);
Zwróć uwagę na brak nawiasów!

Taaa... wygląda nieźle.  Wygląda nieźle, ale tylko do momentu, w którym musimy użyć funkcji makeChanges() w jakimś innym miejscu kodu. Po to przecież ją wyekstrahowaliśmy (pamiętasz zasadę DRY?). Potrzebny wtedy jakiś parametr, a najczęściej dwa... albo i trzy.
Niestety coś takiego w sposób prosty nie zadziała:
jQuery("#name").change(makeChanges(paramOne, paramTwo));
Aby zadziałało funkcja makeChanges() musi zwrócić funkcję gdyż tego wymaga jQuery. Zróbmy więc tak:
function makeChanges(paramOne, paramTwo) {
  return function() { 
    // tu dopiero kod z funkcji nienazwanej
    // z wykorzystaniem parametru paramOne
    // i parametru paramTwo
  } 
}
Teraz działa!

Miłej zabawy :-)

czwartek, 17 marca 2011

Zawartość generowana w plikach layoutu (Layout in layout) w Ruby on Rails

Zagadnienie, które poruszyłem w temacie wzbudza wiele emocji (albo raczej postów na listach). Jak zwykle burza pomysłów u kreatywnych programistów. Oczywiście rozwiązanie jest już zaimplementowane w Railsach. Rozwiązaniem tym jest
content_for
Drobny przykład.
Załóżmy, że na panelu bocznym jest standardowe menu aplikacji. Zasadniczo spełnia ono wszystkie pokładane w nim nadzieje oprócz menu dla usera, które jako jedyne wymaga zmiany hasła. Dobrze by było więc aby podczas operacji dotyczącej użytkownika w panu pojawiała się dodatkowo opcja "zmiana hasła".
W panelu bocznym standardowo menu wygląda tak:
<ul>
  <li>klienci</li>
  <li>płatności</li>
  .
  .
  ...a tu dodatkowe opcje menu w zależności od kontekstu...
</ul>
Zamiast łapać się prawą ręką za lewe ucho użyjmy standardowych mechanizmów Rails.
W rzeczonym szablonie umieszczamy zajawkę:
<ul>
  <li>klienci</li>
  <li>płatności</li>
  .
  .
  <%= yield :new_options %> 
</ul>

zaś w dowolnym pliku *.html.erb używamy content_for:
<% content_for :new_options do %>
  <li>zmień hasło</li>
  <li>sprawdź email</li>
<% end %>

Dzięki temu zapisowi dwie nowe pozycje znajdą się w menu panela bocznego.

Oczywiście w głównym szablonie aplikacji może być więcej nazwanych bloków yield, które będą mogły być wypełniane w zależności od okoliczności. Bardzo wygodne, proste i łatwe.

Po więcej informacji sięgnij do tutoriala Layouty i Renderowanie w Ruby on Rails


poniedziałek, 14 marca 2011

Przykłady użytecznych elementów strony z użyciem jQuery

Ciekawie i prosto zrobione:
http://www.noupe.com/jquery/50-amazing-jquery-examples-part1.html
aczkolwiek szata graficzna pozostawia wiele do życzenia.

Ba Bach - dwa strzały aby spolonizować aplikację Ruby on Rails

Jak spolonizować aplikację pisaną w Ruby on Rails? Wystarczy zerknąć do netu aby złapać się za głowę ile trzeba przekopać materiału aby zdobyć taką wiedzę. Pomysły, pomysły, pomysły... Ludzie ich mają setki. Kreatywni programiści. Na dodatek są w stanie prawicę dać sobie odciąć za słuszność ich pomysłu. Przeglądając je zastanawiałem się jak bardzo można wykręcić sobie prawą nogę aby złapać nią za lewe ucho? Przecież twórcy Rails to przewidzieli. O co kopie kruszyć?

Wystarczą dwa strzały!

Strzał pierwszy, czyli tytułowy Ba:
1. Napisz sobie plik pl.yml. Nie chce się? Pobierz od nas PiszemyProgramy.pl/download/pl.yml i wrzuć do katalogu /config/locales
Strzał drugi, czyli Bach:
2. Dodaj wpis config.i18n.default_locale = :pl do pliku /config/environment.rb

Wygrałeś. Trafiłeś dwie dziesiątki. Koniec pieśni.

Jeśli potrzeba Ci szczegółów przeczytaj to: http://apohllo.pl/guides/i18n.html delektując się pięknem polskiego języka.

Jak masz zapędy masochistyczne i chcesz poznać kreatywność programistów zerknij też tu: http://rubyonrails.pl/forum/p3572-2007-10-22-00:50:44