Mire használható ez a plugin?
A ZipcodeMatch egy, a magyarországi irányĂtĂłszámok Ă©s telepĂĽlĂ©sek egyezĹ‘sĂ©gĂ©t ellenĹ‘rzĹ‘ plugin. ValĂłjában ennĂ©l többre is kĂ©pes, mivel adatbázisa tartalmazza minden magyarországi telepĂĽlĂ©s Ă©s a hozzá tartozĂł irányĂtĂłszámot vagy irányĂtĂłszámokat Ăgy kiválĂłan felhasználhatĂł űrlapok adatbevitelĂ©nek az ellenĹ‘rzĂ©sĂ©re vagy segĂtĂ©sĂ©re.
A kiegĂ©szĂtĹ‘ egy Rails szakdolgozat mellĂ©ktermĂ©kekĂ©nt jött lĂ©tre.
TelepĂtĂ©s
Plugin telepĂtĂ©se
Egyszerűen parancssorból kiadva az alkalmazás könyvtárában:
script/plugin install git://github.com/csiszarattila/zipcodematch.git
Adatok importálása
Az egyszerűbb használat Ă©rdekĂ©ben a kiterjesztĂ©s az adatokat adatbázisban tárolja, az adatbázist pedig egy Zipcode nevű ActiveRecord tĂpusĂş modellen keresztĂĽl Ă©ri el. A modell használatához Ăgy egy migráciĂłval elĹ‘bb lĂ©tre kell hozni a szĂĽksĂ©ges zipcodes elnevezĂ©sű táblát, ezt a plugin generátorával könnyen megteheted:
script/generate zipcodes table
Majd töltsük fel a létrehozott sémát:
rake db:migrate
Majd az adatok beimportálásához az adatbázis táblába futtasd:
rake db:zipcodes:load
(Légy türelemmel, ez a művelet eltarthat egy ideig.)
Példák
Az ellenĹ‘rzĂ©sre a ZipcodeMatch.match?(telepĂĽlĂ©s,irányĂtĂłszám) használhatjuk, amely eldönti, hogy a megadott telepĂĽlĂ©s Ă©s irányĂtĂłszám összetartozik-e (figyelembe veszi, hogy egyes városok több irányĂtĂłszámmal is rendelkezhetnek).
Érdemes alacsony szintű ellenőrzésként alkalmazni egy modellben:
def validate
unless ZipcodeMatch::match?(self.city, self.zipcode)
errors.add_to_base ...
end
end
vagy használd a magasabb szintű validációk egyikét:
class Address < ActiveRecord::Base
...
validates_zipcode_and_city_match
...
end
API
A ZipcodeMatch modul metĂłdusai
ZipcodeMatch osztálymetódus | Mire használható? |
---|---|
match?(telepĂĽlĂ©s,irányĂtĂłszám) | Annak eldöntĂ©se, hogy a telepĂĽlĂ©s Ă©s irányĂtĂłszám egyezik-e |
city_exist?(település) | Annak eldöntésére, hogy a megadott település létezik-e |
zipcode_exist?(irányĂtĂłszám) | Mint az elĹ‘zĹ‘ csak irányĂtĂłszám esetĂ©ben |
city_with_zipcode(irányĂtĂłszám) | Visszaadja az adott irányĂtĂłszámhoz tartozĂł telepĂĽlĂ©st |
zipcodes_for_city(telepĂĽlĂ©s) | Megkeresi az adott telepĂĽlĂ©shez tartozĂł irányĂtĂłszámo(ka)t |
Rake taszkok
A db és zipcode névtéren belül a load (db:zipcodes:load) betölti, a delete (db:zipcodes:delete) pedig kitörli az adatokat az adatbázis táblából.
ActiveRecordos magasabb szintű validációk
Az ellenĹ‘rzĂ©sek egyszerűsĂtĂ©shez az ActiveRecord modellek esetĂ©ben a plugin definiál nĂ©hány magasabb szintű ellenĹ‘rzĂ©st is.
A validates_zipcode_and_city_match kĂ©t mezĹ‘ viszonylatában ellenĹ‘rzi a telepĂĽlĂ©s Ă©s hozzá tartozĂł irányĂtĂłszám egyezĂ©sĂ©t:
class Address < ActiveRecord::Base
...
validates_zipcode_and_city_match
...
end
A hibaĂĽzeneteket mindig a modellhez Ă©s nem az attribĂştumokhoz társĂtja! AlapĂ©rtelmezettkĂ©nt a :city Ă©s :zipcode attributumokat használja fel. Ez megváltoztathatĂł az opciĂłkkal, többek között itt adhatjuk azt is meg, hogy mikor alkalmazza az ellenĹ‘rzĂ©st - alapĂ©rtelmezettkĂ©nt a mentĂ©s során futtatja a validáciĂłt.
validates_zipcode_and_city_match :zipcode_attr_is=>:ir, :city_attr_is=>:varos, :on => :create
A validates_existence_on segĂtsĂ©gĂ©vel vagy a modellhez tartozĂł telepĂĽlĂ©st vagy az irányĂtĂłszámot vizsgálhatjuk meg, hogy Ă©rvĂ©nyes-e. Használatához jellezzĂĽk a metĂłdusnak elsĹ‘ attribĂştumkĂ©nt, hogy melyiket szeretnĂ©nk vizsgálni:
Települések esetében a :city szimbólummal
validates_existence_on :city, :message => "Ilyen nevű település nem létezik!"
IrányĂtĂłszámok esetĂ©ben a :zipcode szimbĂłlummal
validates_existence_on :zipcode, :message => "Ilyen irányĂtĂłszám nem lĂ©tezik!"
Az alapĂ©rtelmezett attribĂştum ezĂşttal is a city vagy a zipcode elnevezĂ©sű lesz, ezt felĂĽlbĂrálni az :attr_is opciĂłval lehetsĂ©ges:
validates_existence_on :city, :attr_is => :varos
Milyen adatokkal dolgozik?
A Magyar Posta weboldalárĂłl letölhetĹ‘ az összes Magyarországi irányĂtĂłszám Ă©s a hozzá tartozĂł cĂm XLS formátumban. Az adatok adatbázisban valĂł tárolásához ezt elĹ‘bb CSV formátumba konvertáltam, majd az adatbázisba töltĂ©skor csak az irányĂtĂłszám Ă©s a hozzá tartozĂł telepĂĽlĂ©s kerĂĽlt mentĂ©sre (az adatforrás több, számunkra szĂĽksĂ©gtelen adatot is tartalmaz).
Ez egyben azt is jelenti, hogy egyes telepĂĽlĂ©sekhez több irányĂtĂłszám is tartozhat. A budapesti irányĂtĂłszámok esetĂ©ben pedig minden irányĂtĂłszám mellett Budapest szerepel mint város, a kerĂĽleteket pedig nem veszi figyelembe. Ha ezen változtatni szeretnĂ©l a ZipcodeMatch.import_from_csv metĂłdust tekintsd meg, ez vĂ©gzi el az irányĂtĂłszámok adatbázisba töltĂ©sĂ©t - a db:zipcodes:load rake taszk pedig ezt hĂvja meg.
Hogyan futtassuk a modellek unit tesztjeit
ProblĂ©mát jelenthet, hogy a modellek egysĂ©g-tesztjeinĂ©l bizonyos esetekben lefuthatnak a validáciĂłk megbolondĂtva ezzel a tesztek kimeneteit.
A gondot az okozza, hogy a tesztek futtatásakor a Rails kitöröl minden táblát Ă©s az fixtureszekkel(alapadatokkal) tölti fel azokat a teszt adatbázisban, Ăgy az alapadatokon kĂvĂĽl nem lehet saját, elĹ‘re definiált adatokkal feltölteni. Viszont Ăgy a ZipcodeMatch modul sem találja az adatbázisban a szĂĽksĂ©ges adatokat.
Ennek feloldására prĂłbálkozhatunk az irányĂtĂłszámok fixtures-kĂ©nt valĂł megadásával - elfogadja a CSV formátumot is - ez azonban jelentĹ‘sen lelassĂthatja a tesztek futtatását, mivel minden teszt futtatása elĹ‘tt a tesztkörnyezet Ăşjratölti az alapadatokat.
EzĂ©rt inkább Ă©rdemes lĂ©trehozni egy, a ZipcodeMatch modult imitálĂł Ăşgynevezett mock osztályt, ami tulajdonkĂ©ppen csak felĂĽlĂrja a modul eredeti metĂłdusait, hogy mindig igaz Ă©rtĂ©kkel tĂ©rjenek vissza.
Egy ilyen mock objektumot megtalálsz a plugin mellett, mindössze includold be annak modellnek a unit test fájljában, amelyik használja a plugin metódusait:
require 'zipcodematch/lib/mocks/zipcode_match.rb'
class AddressTest < ActiveSupport::TestCase
...
end
Ezzel a teszteket fĂĽggetlenĂthetjĂĽk a ZipcodeMatch modultĂłl, amelynek működĂ©se kĂĽlön tesztekkel van biztosĂtva - lásd plugin/ok/konyvtara/zipcodematch/test/ könyvtárt.
Ötletek, kérés, sóhaj, óhaj...
email: csiszar pont ati kukac gmail pont com
www: csiszarattila.com
Copyright (c) 2008 Csiszár Attila, released under the MIT license