Kilka pytan nowicjusza - ruby i rails

Hej,

Zaczalem moja przygode z rubym 2 tygodnie i nawarstwilo mi sie kilka watpliwosci. Napisalem je w punktach, aby nie zasmiecac wielu tematow.

  1. jaka jest roznica pomiedzy zapisem :

def metoda

end

a

def self.metoda

end

Zakladajac, ze obie przeciazaja metode z obiektu bazowego ?

  1. W jaki sposob wywolac metody w klasie http://api.rubyonrails.org/classes/ActionController/AbstractRequest.html , gdy w kontrolerze wywoluje np xhr? dostaje method missing.
  2. Gdzie przechowywac czyste klasy rubyego w strukturze rails ? Chodzi o wlasne rozszerzenia, np wlasna klase zarzadzajaca sesja
  3. Czy istnieje jakas natywna metoda do kodowania struktury do JSON-a i/lub sposob zwracania JSON-a ? Dotychczas wysylalem naglowek application/json i sam skladalem dane do konkretnego lancucha.
  4. Czy znacie jakas metode do wymiany zserializowanych struktur danych z PHP ? Chcialbym wymieniac dane pomiedzy tymi dwoma technologiami, zapisujac je w przestrzeni wymiany i edytujac w zaleznosci od aplikacji w danej technologii. Wiem, ze mozna to napisac samemu, ale ciekaw jestem czy ktos slyszal o takim rozwiazaniu.

Z gory dziekuje za pomoc,

Pozdrawiam

[quote=jonesy]1) jaka jest roznica pomiedzy zapisem :

def metoda

end

a

def self.metoda

end

Zakladajac, ze obie przeciazaja metode z obiektu bazowego ?[/quote]
def method to definicja metody instancji klasy (obiektu) a self.metoda to definicja metody klasy (w innych jezykach statycznej)
Innymi słowy def metoda wywołujesz na obiekcie a def self.metoda na klasie, :

[code=ruby]class Test

def metoda1
end

def self.metoda2
end
end

Test.metoda1 - nie istnieje
Test.new.metoda1 - OK

Test.new.metoda2 - nie istnieje
Test.metoda2 - OK[/code]

xhr? to metoda na obiekcie request, czyli request.xhr? Nie możesz wywołać jej w klasie kontrolera bo ona odnosi się do konkretnego requestu.

Dobrą praktyką jest utworzenie lib/ext albo lib/core_ext i przechowywanie tam rozszerzen chociaz, moze to byc np. plugin w vendor/plugins albo cokolwiek innego.

Istnieje, np. obiekty ActiveRecord mają metodę to_json:

[code=ruby]Theme.find(:first).to_json

=> “{“name”: “default”, “updated_at”: “2008/02/15 16:20:35 +0000”, “id”: 4, “created_at”: “2008/02/15 16:20:35 +0000”}”[/code]
Poza tym istnieją biblioteki do obsługi json.

Najlepiej serializować do jakiegoś wspólnego formatu np. json, xml czy yaml.

Dziekuje za rozwianie watpliwosci.

Mam jeszcze jedno dodatkowe pytanie, ktore przeoczylem.

W jaki sposob rozumiec zapis :nazwa, stosowany np. przy okreslaniu klucza w tablicy asocjacyjnej - sam doczytalem, ze oznacza to odniesienie sie do nazwy zmiennej, a nie do jej wartosci, ale co to w rzeczywistosci oznacza ?

:nazwa to Symbol

Symbol to po prostu wskaźnik z przypisaną nazwą, rózni się od String’a głównie tym, że Ruby nie rezerwuje pamięci dla Symboli które już istnieją:

[code=ruby]>> “abc”.object_id
=> 23456248630100

“abc”.object_id
=> 23456248618320

:abc.object_id
=> 735228
:abc.object_id
=> 735228[/code]
Jak widzisz id obiektu reprezentującego Symbol się nie zmienia, tzn, że istnieje tylko 1 obiekt :abc dla całego procesu.