poniedziałek, 19 grudnia 2011

Jak zamienić string na nazwę klasy

Napotkałem na taki problem: nazwy klas (modeli) mam złożone w postaci zwykłych stringów czyli klasycznych ciągów znaków. Chciałem używać tych stringów jako normalnych klas.

zamiast:
  @employees=Employee.all

użyłem czegoś takiego:
  class_name="Employee"
  @employees=Kernel.const_get(class_name).all

Na pierwszy rzut oka wydaje się to niepotrzebne. Do czasu...

czwartek, 1 grudnia 2011

Dynamiczne dodawanie opcji do kontrolki "select"

Wydawałoby się, że jest to prosta i jakże częsta akcja twórców stron i aplikacji internetowych. Jednak nie udało mi się znaleźć żadnego(sic!) rozwiązania, które byłoby zgodne z duchem Rails. Jak nie ma, to trzeba napisać. Siadłem i popełniłem kod jak poniżej.

Założenia są proste (podam w składni Rails) jest jakaś lista select, na przykład:
<%= select_tag :event_container %>
i chciałbym do tej listy dorzucać pracowników z listy
<%= select_tag(:employee_id,
                options_for_select(Employee.all.map { |employee| [employee.full_name, employee.id] }) %>
Chcę sobie kliknąć na listę z pracownikami, a po kliknięciu zaznaczony pracownik ma "przeskoczyć" z jednej listy na drugą. "Przeskoczyć" to znaczy zniknąć z jednej listy, a pojawić się na drugiej i vice versa.
Do widoku wrzucam więc obserwatory:
<%= observe_field "employee_id",
                   :url => {:action => :move_employee_name},
                   :with => "employee_id" %>
<%= observe_field "event_container",
                   :url => {:action => :remove_employee_from_event},
                   :with => "event_container" %>
i tworzę dla nich pliki RJS odpowiednio: move_employee_name.rjs i remove_employee_from_event.rjs. Muszą one być skorelowane z metodami o takich samych nazwach w kontrolerze! Nie zapomnieć!
Wpisy w move_employee_name.rjs dotyczą oczywiście kontrolek select:
page[:event_container].addNewOption @employee.full_name, @employee.id
page[:employee_id].removeSelectedOption
Wpisy w remove_employee_from_event.rjs są analogiczne
page[:employee_id].addNewOption @employee.full_name, @employee.id
page[:event_container].removeSelectedOption

I tu pytanie za 12 punktów: skąd RJS zna te dziwne metody? Mowa oczywiście o ".addNewOption" i ".removeSelectedOption". I od razu odpowiedź: wpisałem je w /public/javascripts/application.js w postaci:
/* Dodawanie metod do szablonów RJS. */
Element.addMethods({
 /* Dodawanie nowej opcji do kontrolki select. W tym przypadku jest to "element". */
 addNewOption: function(element, option, id) {
  element.options.add(new Option(option, id));
  return element;
 },
 /* Usuwanie zaznaczonej opcji w kontrolce select. Bez parametrów, gdyż funkcja leci po wszystkich. */
 removeSelectedOption: function(element) {
  var i;
  for (i = element.length - 1; i >= 0; i--) {
   if (element.options[i].selected) {
    element.remove(i);
    return;
   }
  }
 }
});
Tam jest właśnie cała magia :-)

Sposób opisany tu przeze mnie jest jak najbardziej zgodny z ideą Rails. Daje się łatwo utrzymać w kodzie aplikacji i jest czytelny. Nic tylko brać!

poniedziałek, 8 sierpnia 2011

Polski słownik do Intellij Idea

Nareszcie udało mi się podłączyć polski słownik do mojego ulubionego IDE. Niech będzie, że to reklama i ujawnię (wszakże jest to w temacie), że moim ulubionym IDE jest Intellij Idea. Po jaką cholerę oni tak komplikują tę nazwę? Nie wiem.
Ale ad rem! W środowisku tym możemy podłączyć plik słownika w formacie .dic. Proszę mnie nie pytać jak wygląda ten format. Nie wiem. Wiem natomiast jak go wygenerować.
O tak (w jednej linijce):

aspell --lang pl dump master | aspell --lang pl expand | tr ' ' '\n' > polish.dic


Czyli wchodzę sobie do mojego Linuxa i w terminalu wpisuje powyższą linijkę, czekam chwiluśkę i mam słownik! Nie obywa się oczywiście bez schodów (w Linuxie nic nie obywa się bez schodów) bo system mi pisze, że w katalogu \usr\lib\cos_tam\aspell nie ma żadnego pliku o nazwie pl. W Ubuntu wchodzę sobie w instalator pakietów i doinstalowuję pakiet o wdzięcznie brzmiącej nazwie aspell-pl. Od tej chwili czary już działają. Aby dokończyć dzieła wchodzę do Idei i w Settings wybieram opcję spelling, a tam dodaję katalog, w którym znajduje się wygenerowany plik polish.dic. Idea sama już wszystko dorozumie :-)

wtorek, 28 czerwca 2011

Zmiana położenia profilu i dokumentów w Windows 7

Pierwszą rzeczą, którą robię po instalacji Windows 7 to zmiana położenia profilu dla użytkowników. Dlaczego wszystkie moje dane mają leżeć na partycji, która może być szybko przeinstalowywana? Dziwne, że Microshit nie wpadł na taki pomysł! Można by to zrealizować podczas instalacji Windows, w przypadku gdy jest więcej niż jedna partycja... Ale może nie bardzo to takie dziwne w porównaniu z ich innymi wybrykami.
Co by nie gadał przenieść profile trzeba. Używam takich sztuczek:
  1. Zabezpieczam rejestr. I żeby mi nikt nie pisał, że nie ostrzegałem...
  2. Kopiuję cały folder C:\Users na inny dysk. Dla skupienia uwagi przyjmijmy, że to będzie dysk D:. Jako ciekawostkę podaję, że ten folder widać w systemie jako C:\Użytkownicy i z taką nazwą przekopiuje się na D:. Uwaga! W folderze tym są ukryte pliki i foldery! Należałoby więc wejść do Eksploratora Windows, z menu wybrać Narzędzia -> Opcje Folderów -> Widok -> Pokaż ukryte pliki, foldery i dyski. Dopiero wtedy przekopiuje się OK.
  3. Otwieram edytor rejestru (regedit) i wchodzę w drzewko HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CurrentVersion\ProfileList
  4. Zmieniam tam 3 (słownie trzy) wartości. Czyli Default, Public, Profile Directory
  5. No i przelogowuję się. Można już zakładać nowego użytkownika, który pokaże się w nowej lokalizacji na innej partycji.
Tak to mogłoby wyglądać przed zmianą:

A tak po zmianie:

Rzecz całą wyczytałem na: http://www.windows7hacker.com/index.php/2009/05/how-to-change-user-profile-default-location-in-windows-7/

poniedziałek, 30 maja 2011

Program do prostych screencastów

Nie potrzeba nic instalować. Usługa już z hostingiem. Dla prostych, szybkich screencastów dla klienta wymarzony:
http://www.screenr.com/