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

sobota, 12 marca 2011

GIT - kontrowersje i problemy

Jak się okazało nie tylko ja wieszam psy na panu Linusie za wyprodukowanie gigantycznego problemu w postaci GIT'a. Ale do rzeczy.
Wspomniana przeze mnie we wcześniejszych postach książka Pro Git ukazuje w sekcji o cofaniu zmian komendę:
> git commit --amend //nie używaj tego!
jako receptę na zapomniane poprawki. Autor z lekkością motylka zawiadamia czytelnika o pięknych możliwościach git'a. Na litość boską! Nie używaj tego! Mogą Cię za to zaszlachtować inni uczestnicy projektu. Narobisz takiego bigosu w kodzie i tylu problemów dla prowadzącego projekt, że raczej nie rozważy poważnie Twojej kandydatury podczas rozdzielania premii, albo po prostu Cię wyleje i będzie miał spokój.
To co się dzieje w publicznym repozytorium po użyciu tego cholerstwa... Omg!
Najlepiej jest to opisane tutaj:
http://stackoverflow.com/questions/253055/how-do-i-push-amended-commit-to-the-remote-git-repo
ale życzę abyś nie miał z tym nic do czynienia.

piątek, 11 marca 2011

GIT - usuwanie kilku commitów jednym poleceniem

Jak wiadomo usunięcie konkretnego commita w GIT'cie odbywa się komendą:
git revert odcisk_SHA
Całe szczęście, że można wpisywać tylko 7 pierwszych znaków odcisku SHA commita.
Aby sprawdzić ostatnie np. dwa odciski commitów zawołaj:
git log -2
Czasami się tak zdarza, że można zabrnąć w kodzie w ślepą uliczkę nie tworząc do tego gałęzi (branch). Może zaistnieć wtedy potrzeba usunięcia pod rząd kilku commitów. Wpisywanie "z palca" raczej nie wchodzi w rachubę bo można oszaleć. Trzeba więc było coś wymyślić.
Z pomocą przyszła komenda
git rev-list
Ma ona mnóstwo opcji, ale w podstawie wyświetla ona między innymi odciski SHA commitów. Gdy się użyje w takiej składni:
git rev-list f182667 --max-count=5
to wyświetlone zostanie 5 odcisków commitów  począwszy od commita oznaczonego jako f182667. No to już bliziutko do finału, który brzmi:

for i in `git rev-list f182667 --max-count=5`; do git revert --no-edit $i; done
Po co została użyta opcja --no-edit? Ano gdyby jej nie było, to pięć razy git by prosił o opisanie kolejnie wykonywanej operacji revert. Upierdliwe, że hej.

UWAGA! Pułapka: te górne apostrofki to nie są te normalne... To są te po lewej stronie klawisza "1" pod tyldą "~".

Rake spis poleceń

Udało mi się znaleźć prawie kompletny spis poleceń Rake dla Ruby on Rails.

  • rake gems:install - instaluje gemy zawarte w pliku config/environment.rb
  • rake db:fixtures:load - Load fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y
  • rake db:migrate - Migrate the database through scripts in db/migrate. Target specific version with VERSION=x
  • rake db:schema:dump - Create a db/schema.rb file that can be portably used against any DB supported by AR.
  • rake db:schema:load - Load a schema.rb file into the database.
  • rake db:sessions:clear - Clear the sessions table.
  • rake db:sessions:create - Creates a sessions table for use with CGI::Session::ActiveRecordStore.
  • rake db:structure:dump - Dump the database structure to a SQL file.
  • rake db:test:clone - Recreate the test database from the current environment's database schema.
  • rake db:test:clone_structure - Recreate the test databases from the development structure.
  • rake db:test:prepare - Prepare the test database and load the schema.
  • rake db:test:purge - Empty the test database.
  • rake doc:appBuild the app HTML Files.
  • rake doc:clobber_app - Remove rdoc products.
  • rake doc:clobber_plugins - Remove plugin documentation.
  • rake doc:clobber_rails Remove rdoc products.
  • rake doc:plugins - Generate documation for all installed plugins.
  • rake doc:rails - Build the rails HTML Files.
  • rake doc:reapp - Force a rebuild of the RDOC files
  • rake doc:rerails - Force a rebuild of the RDOC files
  • rake log:clear - Truncates all *.log files in log/ to zero bytes
  • rake rails:freeze:edge - Lock this application to latest Edge Rails. Lock a specific revision with REVISION=X.
  • rake rails:freeze:gems - Lock this application to the current gems (by unpacking them into vendor/rails)
  • rake rails:unfreeze - Unlock this application from freeze of gems or edge and return to a fluid use of system gems
  • rake rails:update - Update both scripts and public/javascripts from Rails.
  • rake rails:update:javascripts - Update your javascripts from your current rails install.
  • rake rails:update:scripts - Add new scripts to the application script/ directory.
  • rake stats - Report code statistics (KLOCs, etc) from the application.
  • rake test - Test all units and functionals
  • rake test:functionals - Run tests for functionalsdb:test:prepare
  • rake test:integration - Run tests for integrationdb:test:prepare
  • rake test:plugins - Run tests for pluginsenvironment
  • rake test:recent - Run tests for recentdb:test:prepare
  • rake test:uncommitted - Run tests for uncommitteddb:test:prepare
  • rake test:units - Run tests for unitsdb:test:prepare
  • rake tmp:cache:clear - Clears all files and directories in tmp/cache
  • rake tmp:clear - Clear session, cache, and socket files from tmp/
  • rake tmp:create - Creates tmp directories for sessions, cache, and sockets
  • rake tmp:sessions:clear - Clears all files in tmp/sessions
  • rake tmp:sockets:clear - Clears all ruby_sess.* files in tmp/sessions

Źródło na:
http://www.tutorialspoint.com/ruby-on-rails/rails-and-rake.htm
Wszystko w jednym miejscu, krótko i treściwie.

GIT - używanie, czyli codzienne starcia z urojeniami Linusa

Mimo, że używam GIT'a na co dzień, to gdyby mnie ktoś zapytał dlaczego, udzieliłbym nieco wymijającej odpowiedzi. Osobiście nie mam o nim dobrego zdania. System wygląda na projekt, który miał być mały, a stał się za duży. Co ciekawe tak chyba było w istocie. Linus tworząc Linuxa napisał system kontroli wersji dla tego projektu. Zaczęto go używać powszechnie, bo na wolnej licencji , bo tworzył to wielki Linus... Diabli wiedzą dlaczego...
Logiki tam z lupą szukać. Weźmy pierwszy z brzegu przykład. Utworzenie nowej gałęzi wygląda normalnie:
git branch test
ale przełączenie się na nią to już prawą nogą za lewe ucho:
git checkout test
O kurde! COŚ jest nie tak. Sprawdzamy wobec tego co to jest checkout:
http://www.diki.pl/slownik-angielskiego/?q=checkout&x=0&y=0
I dowiadujemy się, że to kasa, bądź wymeldowanie. Na litość boską! Towarzyszu Linusie, skąd ci to wpadło do głowy? Słówko "branch" (gałąź) cię boli? Czyli gałąź niedokładnie opisuje gałąź? Lepiej do przełączenia na gałąź użyć słowa kasa-wymeldowanie? Dlaczego nie "cegła" albo "sznurówka"? Tak samo przypadkowe i tak samo dobre.
Myślisz drogi czytaczu, że to odosobniony przypadek? Można książkę napisać o głupotach GIT'a. Zresztą niech przemówią fakty. Wrzuć w google frazę "git commit", a zaraz potem "bazaar commit". Sprawdź za każdym razem ilość wyników. I co? Tobie też wyszło, że stron wyjaśniających działanie GIT'a jest (uwaga!) stopiętnaścierazywięcej? Albo 115 razy więcej?! Każdy, kto choć chwilę się nad tym zastanowi natychmiast odrzuci kwestię popularności GIT'a versus Bazaar'a. Bazaar jest po prostu prosty :-) Fajnie wyszło: "po prostu prosty". Ale tak jest w istocie. Bazaar jest prosty. W Bazaar aby cofnąć ostatni commit piszesz:
bazaar uncommit
O zgrozo! Jak prosto i domyślnie!
Sprawdźmy więc jak to się robi w GIT:
git revert 1ed35d3
To nie ściema! Tak jest naprawdę. I to jest skrócona wersja! Użyłem klucza tylko w wersji 7-dmio znakowej. A co by było gdybym musiał użyć całego klucza SHA? Drogi Linusie! Brawa za kreatywność.
Pomijam tu kwestię, że na przykład, w skądinąd dobrej książce o Git'cie:
http://progit.org/book/pl/
na próżno będziesz szukał informacji na temat jak cofnąć ostatni commit. Ciekawe no nie? Ciekawym też jest fakt, że w ogóle taka książka jest potrzebna. Wiem, bo ją przeczytałem. Nie dlatego abym był masochistą. Nie zwariowałem. Przeczytałem, bo trzeba się było nauczyć. Ale, jak widać, jej przeczytanie nie daje nawet tak podstawowej wiedzy jak cofnąć commit. A teraz uwaga... aby korzystać bezproblemowo z Bazaara wystarczy poświęcić kwadrans na przeczytanie jednego tutoriala. Więcej tutoriali ani książek nie ma. Nie ma... zgadnij dlaczego? Ano dlatego, że nie potrzeba. Tam wszystko jest prosto i kawa na ławę. Jeden tutorial i po sprawie. Po co się rozpisywać skoro wszystko jest proste?
Już słyszę te pytania: "dlaczego, baranie, nie używasz więc Bazaara?". Ano spuszczę głowę i odpowiem, że dla tego samego co durnych windowsów. Wszędzie do tego coś jest. A to wtyczka do NetBeansów i Idei. A to u naszego dostawcy usług hostingowych pełne wsparcie i tutoriale. Masakra! Uległem wielkości githuba. Stuliłem po sobie uszy, przymknąłem paszczę i używam tej durnoty. Mam nadzieję, że Ty, jak już dotarłeś do końca tych słów, to chociaż obejrzysz Bazaara i zapłaczesz dlaczego takie wspaniałe narzędzie pozostaje w cieniu fantasmagorii wielkiego Linusa.

Ach... byłbym zapomniał... kolejny z milionów tutoriali o GIT'cie:
http://marioosh.5dots.pl/2009/06/27/gitowy-system-kontroli-wersji.html
tam chociaż jest coś o cofnięciu commita...