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.

