07 maja 2009
Dla tych co nie wiedzą co to method_missing i co chodzi z ! polecam posty na blogu radarka:
Ruby a metody z '?' i '!' w nazwie oraz
method_missing w Rubym - nie pomiń niczego!
Załóżmy, że piszemy bibliotekę dodającą sporo metod do klasy String i chcielibyśmy żeby każda metoda miała swój odpowiednik zakończony '!'.
Można to zrobić w taki sposób:
class String
def plural
self !~ /s$/ ? self + "s" : self # tylko dla przyykladu
end
def plural!
self.replace(plural)
end
def foo
...
end
def foo!
self.replace(foo)
end
end
Ale jest to co najmniej średnio wygodne.
Z pomocą przychodzi method_missing. W bardzo łatwy sposób można zdefiniować regułę, która wyłapie odwołanie do nieistniejącej metody zakończonej '!'.
Więcej...
01 kwietnia 2009
Ktoś pewnie stwierdzi "kolejny post o Merbie, bezsensu za chwile i tak się połączy z Rails". Kiedy to nastąpi to jeszcze nie wiadomo, poza tym Merb aż tak szybko nie zniknie a migracja na Rails3 ma być w miare bezbolesna. Ale ja nie o tym. DataMapper mnie ostatnio wkurzył, co chwile coś się wywala, coś nie działa. Doszedłem do wniosku, że mam dość. Wybór padł na Sequela. A skoro Sequel działa pod JRuby (w przeciwieństwie do DataMapper) to dlaczego by nie pobawić się też z Javową implementacją Ruby. Z tej mojej zabawy wyszedł ten oto pokrętny mini-tutorial. Enjoy.
Więcej...
04 marca 2009
Większości znających Ruby on Rails temat "Polymorphic Associations" nie jest zapewne obcy ( z wiki railsów nie działa).
W skrócie chodzi o relacje odnoszącą się do obiektów z różnych klas. (Nie umiem tłumaczyć, ale skoro nadal to czytasz to pewnie wiesz o.c.b.)
Przejdźmy do konkretów. O ile w ActiveRecord wystarczy dodac :polymorphic => true to w api Datamappera nie znalazłem takie opcji. Jednak nic nie stoi na przeszkodzie aby napisać to samemu.
Posłużę się pewnym przykładem: chcę aby każda operacja stworzenia nowego obiektu została zapisana. Do tego celu zostanie wykorzystany model Event.
Więcej...
27 stycznia 2009
Tym razem będzie bardzo krótko. Potrzebowałem sprawdzenia za każdym razem wartości Setting[:theme] i na jej podstawie ustawić katalog "poszukiwań" pliku z szablonem...
class Application < Merb::Controller
before do
template_roots[1] = ['themes' / Setting[:theme] / 'views', :_template_location]
end
end
... i działa ;]
Dzięki temu nie trzeba przekazywać do każdego display/render bezwzględnej ścieżki do pliku.
05 stycznia 2009
Jakiś czas temu stwierdziłem, że przydała by mi się aplikacja do parsowania plików .haml podczas tworzenia designu dla strony. Z pomocą przyszedł rack.
Wszystko zakończyło się w 13 linijkach ;)
require "rack/response"
require "haml"
app = Proc.new do |env|
path = env["REQUEST_URI"].sub("/", "")
if path =~ /\.haml$/
[200, {"Content-type" => "text/html"}, Haml::Engine.new(File.read(path)).render]
else
Rack::File.new(Dir.pwd).call(env)
end
end
run app
A wszystko odpalane poprzez:
thin start -R design.ru -p 9999
W przeglądarce wpisujemy np. "localhost:9999/foo/bar.haml" i zostanie wyrenderowany plik bar.haml z folderu foo. Pliki inne niż .haml nie zostaną zparsowane.