teamon.eu

Ruby - ! poprzez method_missing

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... 8 komentarzy

JRuby + Merb + Sequel

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... Dodaj komentarz

Datamapper - asocjajcje polimorficzne (i nie tylko)

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... 1 komentarz

Dynamiczna zmiana folderu z szablonami w Merbie

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.

Dodaj komentarz

Rack - Prosty parser haml

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.

10 komentarzy