czwartek, 31 marca 2011

Stronicowanie w Ruby on Rails - najpopularniejsze opcje

Mowa oczywiście o pluginie do Ruby on Rails o nazwie will_paginate.

Aby go zainstalować z konsoli zawołaj:
gem install will_paginate
potem do
/config/environment.rb
wpisz
config.gem 'will_paginate', :version => '~> 2.3.15'
przy czym uwaga! :version => '~> 2.3.15' nie tyczy się wersji rails, tylko wersji tego plugina!

Opcje wyświetlania:
  • :previous_label — domyślnie: "« Previous", nazwa linka do poprzedniej strony
  • :next_label — domyślnie: "Next »" , nazwa linka do następnej strony
  • :page_links — kiedy jest to false, tylko poprzedni/następny link jest renderowany (domyślnie: true)
  • :inner_window — mówi ile linków widnieje przed i za aktualną stroną (domyślnie: 4)
  • :outer_window — mówi ile linków widnieje dookoła pierwszej i ostatniej strony (domyślnie: 1)
  • :separator — string reprezentujący separator oddzielający numerki stron (domyślnie: pojedyncza spacja) 
Na przykład:
<%= will_paginate @customers, :previous_label => "wstecz", :next_label => "dalej" %>


Opcje HTML:
  • :class — nazwa klasy CSS dla wygenerowanego DIV'a (domyślnie: "pagination")
  • :container — przełącza renderowanie dla podanego wcześniej DIV'a. Ustaw na false tylko w przypadku stosowanie własnych rozwiązań (domyślnie: true)
  • :id — HTML ID dla kontenera z linkami  (domyślnie: nil). Ustaw true dla automatycznego rozpoznawania ID z nazwy klasy obiektów kolekcji. Na przykład jeśli stronicujesz model ArticleComment to automatycznie zostanie nadany ID "article_comments_pagination". 
Opcje zaawansowane:
  • :param_name — nazwa parametru zawartego w URL  (domyślnie:page)
  • :params — dodatkowe parametry przy generowaniu stronicowania (na przykład :controller => "foo", :action => nil)
  • :renderer — nazwa klasy, klasa lub instancja klasy dla renderowanych linków (domyślnie: WillPaginate::LinkRenderer)
Wszystkie opcje rozpoznawane przez will_paginate stają się automatycznie opcjami kontenera DIV. Na przykład:
<%= will_paginate @posts, :style => 'font-size: small' %>
… staje się po renderowaniu:
<div class="pagination" style="font-size: small"> ... </div>



Pełna dokumentacja na naszej stronie poświęconej dokumentacji API will_paginate.


Stronicowanie w Ruby on Rails - dokumentacja do API

Skądinąd dobry plugin dla Ruby on Rails do stronicowania o tajemniczej nazwie will_paginate ma kilka ciekawych możliwości. Niestety o możliwościach tych nie dowiesz się ze strony macierzystej. Większość linków tam nie działa. Nie pytaj dlaczego. Nie wiem. Nie wiedzą również o tym inni internauci. Powstają na grupach nawet wątki z pytaniami do autora o ten fenomen.

Kogo denerwuje brak dokumentacji do API tego pluginu mam dla niego rozwiązanie. Jako, że nas to też wkurzyło przygotowaliśmy dla wszystkich dokumentację API dla will_paginate v. 2.3.15. Korzystaj :-)


niedziela, 27 marca 2011

Jak w C++ zainicjalizować otwarcie pliku klasą std::string

#include <iostream>
#include <fstream>
#include <string>

int main()
{
  std::string filename = "testfile";      
  std::ifstream fin;

  fin.open(filename.c_str()); // Works just fine.
  fin.close();

  //fin.open(filename); // Error: no such method.
  //fin.close();
}

Pełny tekst tutaj:
http://stackoverflow.com/questions/32332/why-dont-the-stdfstream-classes-take-a-stdstring

Polskie literki w czystym Qt

w nagłówku:
#include <QTextCodec>

na początku programu należy wywołać:

// w tłumaczeniach np. tr("ąśżźćółń");
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
// w pozostałych tekstach klasy QString
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

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