Ebben az útmutatóban megpróbálom leírni, hogyan lehet saját gem-ből egy, a gem-hez tartozó sablon fájlból generálni javascript kódot rails3 alkalmazásban. Ez olyan esetekben lehet hasznos, ha több alkalmazásunk van és egy form hitelesítést mindegyikben alkalmazni szeretnénk, így csak egyszer kell megírni. Más helyen is hasznos lehet, ahol javascriptet szeretnénk dinamikusan generálni. Az útmutató nem tartalmazza a teljes forráskódot, mert az túlságosan széttördelné a gondolatmenetet.
Először meg kell csinálnunk a gem fájlstruktúrát:
- jsvalidator- lib- jsvalidator.js.erb
- jsvalidator.rb- jsvalidator.gemspec
Ezután szerkesszük a jsvalidator.gemspec fájlt, amit a jsvalidator könytárban hoztunk létre.
Gem::Specification.new do |spec| spec.name = 'jsvalidator' spec.version ='0.0.1' spec.files = ["lib/jsvalidator.js.erb", "lib/jsvalidator.rb"] spec.summary = "Javascript form validator for rails3 with javascript." spec.author = 'Programmer' spec.email = 'programmer@yourdomain.com' spec.homepage = 'http://www.yourdomain.com' spec.has_rdoc = false end
Az osztály struktúrát a jsvalidator.rb fájlban hozzuk létre. Az Erubis gem-et a "gem install erubis" paranccsal hozhatjuk létre.
require 'rubygems' require 'active_support' require 'erubis' class Jsvalidator # form object definiálása attr_accessor :form def form return @form end # mi most nem inicializálunk semmit, de ebben a blokkban lehet # a kezdeti paramétereket beállítani def initialize end # csinálunk egy függvényt, hogy a formunkat leírjuk, # ez most egy másik object lesz valójában, amit később definiálunk def define_form(attributes={}) f=Form.new(attributes) @form=f if f end # a jsvalidator_helper egy olyan függvény, amit a Jsvalidator osztályból fogunk # meghívni def jsvalidator_helper # __FILE__ az a konstans, ami ezt a file-t jelenti path=File.dirname(__FILE__) template_path=File.join(path, 'jsvalidator.js.erb') # megadhatunk különböző objecteket a sablonnak, mint pl.: @jsvalidator, # ami jelen esetben self, mivel most csak a Jsvalidator osztállyal dolgozunk vars={ '@jsvalidator' => self } # tehát beolvassuk a sablon fájlt template= File.read(template_path) # Az Erubis végrehajtja a sablonban lévő ruby kifejezéseket és objecteket javascript=Erubis::Eruby.new(template).result(vars) # eután megcsináljuk a visszatérési stringet javascript="<script type="\text/javascript\"> //<![CDATA[ " + javascript + " //]]> </script>" return javascript end # a Jsvalidator osztály vége end # ezután írjuk le a Form osztályt class Form < Jsvalidator # Bármilyen objectet létre lehet hozni benne, mi most csak a Form.id-t használjuk attr_accessor :id def initialize(attributes={}) @id=attributes[:id] end end
Ebben a fájlban megcsináhatjuk a modelt és az adatstruktúrát is. Ezután szerkesszük meg a sjvalidator.js.erb fájlt. Ebben a javascriptünket fogjuk leírni, amit majd a view oldalunkba illesztünk be. Ebben a sablonban használhatunk bármilyen ruby-s kifejezést úgy, mintha view-ban tennénk, pl.: <%= @jsvalidator.akarmi %>, de előbb ezeket az objecteket definiálnunk kellett a Form osztályban.
document.observe("dom:loaded", function() { new Form.Observer("<%= @jsvalidator.form.id %>", 0.3, function(form, value) { // most megvannak a form értékeink egyetlen url formátumú sorban // tehát meg kell csinálnunk a mező - érték párokat, ehhez a textArray segít textArray=unescape(value).split("&"); var i=0; for(i=0; i<(textArray.length); i++) { // ezután az összes érték a cikluson belüll esz látható // a textArray[i] egy mező-érték párt jelent, ezt is felbontjuk value_line_with_equal_sign=textArray[i]; value_name=""; value_value=""; value_name=value_line_with_equal_sign.split("=",2)[0]; value_value=value_line_with_equal_sign.split("=",2)[1]; // mostmár megvannak az értékek, bármit le tudunk ellenőrizni // a value_name a mező neve // a value_value a mező értéke } } }
Ezután megcsináljuk a gem-et a jsvalidator könytárban, parancsorban:
gem build jsvalidator.gemspec
és installáljuk:
sudo gem install jsvalidator
Ezután módosítsuk a Gemfile fájlt, ami a Rails3 alkalmazásunk könyvátárában van. Illesszük be a következő sort:
gem 'jsvalidator', :path = "/home/user/gems/jsvalidator", :require = "jsvalidator"
Ezután parancssorba gépeljük be:
bundler update
Amennyiben nem akarsz gem-et létrehozni, mert folyamatosan szeretnéd tesztelni a kódot, egyszerűen adjuk hozzá az application_controller.rb fájlhoz ezt a sort a megfelelő elérési úttal:
require '/home/user/gems/jsvalidator/lib/jsvalidator.rb'
Mostmár csak a helpert kell hozzáadninuk a form view fájlunkhoz:
<% @jsvalidator=Jsvalidator.new %> <% @jsvalidator.define_form( :id => "your_form_id" %> <%= raw @jsvalidator.jsvalidator_helper %>
Ennyi az egész.
Az eredeti cikk megtalálható angolul a ruby-on-rails-tutorials.blogspot.com/2010/10/how-to-generate-inline-javascript-by.html linken.