Witaj na blogu prowadzonym przez Sebana. Spisuję tutaj swoje uwagi na różny temat. Przeważają tematy związane z Internetem, popieranymi przeze mnie rozwiązaniami dotyczącymi wykorzystania komputerów, oraz kilka innych.

UJS, atrytuby data-* w Rails 3

20 września 2010 | Klucze: it, programowanie, rails, Techblog
8 komentarzy. trackback

Ostatnio sporo radności i satysfakcji daje mi zabawa z nowymi Railsami. Pisząc nowymi mam na myśli nowinki jakie pojawiły się w Rails 3. Ponieważ mam podejście do "jeśli piszę coś w domu i nikt mnie nie ogranicza to użyję coś czego nie mam okazji używać nacodzień". W końcu trzeba się czegoś nowego czasem nauczyć ;). I tak ostatnio trochę bawiłem się jQuery w Rails 3.

Każdy kto śledził nowości w Rails 3 wie, że teraz na topie jest "unobtrusive JavaScript" i korzystanie z niestandardowych atrybutów data-*. I tak to co w wcześniejszych wersjach wypluwał helper:

link_to 'Delete', object_path(object), :confirm => "Are you sure?", :method => :delete
wstawiało jakieś wstrętne i rozwlekłe kody JS, a teraz wygląda tak:
<a href="/object/1024" data-method="delete" data-confirm="Are you sure?">Delete</a>
Przez to kod wypluwany przez metody pomocnicze nie ma bezpośrednio do czynienia z kodem JavaScript i nie ma znaczenia czy jest używany Prototype, jQuery czy coś jeszcze innego. Obsługa tego typu helperów umieszczona jest standardowo w pliku public/javascripts/rails.js. Poniżej zademonstruję jak zaimplementować obsługę własnych atrybutow data-*.

Przykładowe zadanie: wyświetlać ilość wpisanych w textarea znaków.
W widoku będzie coś takiego:

= form_for(:message, :url => messages_path, :html => { :class => "form", :id => "new_message_form" }) do |f|
  = f.text_area :body, "data-counter" => "span#message-counter"
  # bla bla bla
W rezultacie zostanie wypluty HTML:
 
<form action="/messages">
  <textarea name="message_body" data-counter="span#message-counter" />
</form>
 
Aby licznik automatycznie się odświeżał należy dopisać jego obsługę w JS, ja użyłem jQuery i zrobiłem to tak:
$(document).ready(function() {
  $(document).find('*[data-counter]').each(function(element) {
    var counter = $($(this).attr('data-counter'));
    $(this).keyup(function(event) { counter.html($(this).val().length) })
  })
})
Trzeba tylko pamiętać by plik JS ładować w szablonie za pomocą javascript_include_tag.

Ciekawe linki na podobny temat:

Rails 3 + Ruby 1.9.2 + Megiteam

04 września 2010 | Klucze: programowanie, rails, ruby, Techblog
2 komentarze. trackback

Jak powszechnie wiadomo Rails 3 zostało wydane. Niektórzy niecierpliwi (w tym ja) już wcześniej bawili się wersjami beta i release candidate. Kilka osób już chwaliło się udanymi przejściami z wersji 2.3 na 3.0. Dla mnie Rails 3 to przede wszsytkim okazja na przejście z Ruby 1.8 do 1.9. Dziś opiszę w jaki sposób uruchomiłem tandem Rails 3.0 - Ruby 1.9.2 na hostingu współdzielonym Megiteam.

Ruby 1.9.2

Moja ulubiona firma hostingowa - Megiteam już od dłuższego czasu dawała możliwość korzystania z Ruby 1.9.1-p0. Jak zrobić to krok bo kroku w pomocy Megiteam. Bułka z masłem. Napisałem maila do Pani Magdy i po godzinie wersja była podbita do 1.9.2. Jedyną rzeczą jaką musiałem zrobić, a której nie ma w ww. artykule to dopisanie katalogu z plikami wykonywalnymi gemów do PATH: /home/seban/www/.ruby/gems/1.9/bin/. Pierwszy sukces! Tak, pewnie można zrobić to za pomocą rvm, jednak ja nie próbowałem.

Bundler

Jeśli nie wiesz co to jest Bundler zachęcam do przeczytania artykułu w serwisie rubysfera.pl.
Instalacja bundlera: gem install bundler. Nie powinno być najmniejszych problemów. Drugi sukces!

Thin

Megiteam daje trzy możliwości uruchamiana aplikacji Rails:

  • Mongrel, Ruby 1.8
  • Thin, Ruby 1.8
  • Thin,Ruby 1.9
Jak widać wybór dla Ruby 1.9 jest bardzo prosty ;). Wybrałem thin. Jednakże tutaj pojawił się problem. Po zdeployowaniu aplikacji (o tym za chwile) aplikacja nie wstawała. Według mnie problemem okazała się wersja thina, domyślnie jest to 1.2.2. Po zainstalowaniu (zwykłe gem install) najnowszej wersji 1.2.7 aplikacja wstała już bez problemu. Dodatkowo trzeba pamiętać by ustawić zmienną środowiskową RACK_ENV na żądane przez nas środowisko - 'production'.

Deploy

Deploy za pomoca Capistrano nie różni się specjalnie od standardowego. Musimy jedynie zmienić dwie rzeczy:

  • deploy musi uwzględniać użycie bundlera
  • restart aplikacji musi się odbyć za pomocą meigteamowego skryptu 'restart-app'
Pierwszą sprawę załatwiłem metodą copy-paste. Kacper Bielecki przedstawił już działające rozwiązanie połączenia bundlera i capistrano. Wszystko jest tam całkiem proste i dobrze wytłumaczone.
Restart aplikacji już kiedyś opisywałem. Cały Capfile dostępny jest w formie gista.