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".

Brak komentarzy:

Prześlij komentarz