Programmazione



Reverse URL translation with Globalize - Rails


Globalize is one of possible way(see the comparison) to translate a Rails app, you are forced to use a database to do this but It's really a powerful method to localize  an application because this plugin adds a method .t to every String.

Unfortunatly the method .t is just for English-to-otherLanguage translation so you have to hack it a bit to have reverse translation.

Here's the method I used to translate the URL:

  • Name of the controller statically translated in routes.rb
  • Translation of each chunk after in the controller


So I'll be able to manage, at the same way, url like:

http://x.com/ristorante/ricette/insalata.html
http://x.com/restaurant/recipes/salad.html

# config/environment.rb
# [...]

include Globalize
Locale.set_base_language 'en'


# enables reverse translation and redefine String#t
class String

alias :old_t :t

def t
if self.old_t == self.to_s
q = Translation.find_by_sql("SELECT tr_key FROM globalize_translations g where text='#{self.to_s}'")

if q.empty? # there's no translation
return self
else
return q[0].tr_key
end
else
self.old_t
end
end

end

Restart /script/server 

# config/routes.rb
# [...]

  map.connect 'ristorante/*url' ,
:controller => 'restaurant', :action=>'translate', :language => 'it'

  map.connect 'restaurant/*url' ,
:controller => 'restaurant', :action=>'translate', :language => 'en'
# app/controllers/restaurant_controller.rb
# [...]

def translate
if params[:url].nil? or params[:url].empty?
@url = []

url_join=url.join('/')

case url_join

# url empty
when ''
render :text => 'main'

# restaurant/ + recipes/pizza.html
when /^\w+\/+\w+\.html$/ then

# try to search 'pizza'.t in the db, without '.html'
@recipe= Recipe.find(:first, :conditions=> ["name = ?",@url[1].split('.')[0].t])

if @url[0] == 'recipes'.t
render :partial => 'view_recipe'
# if the same regexp match to some other subaction
elsif @url[0] == 'ingredients'.t
render :view_ingredients => 'view_ingredients'
else
render :text => 'Error 404' --> '+url_join
end


end

Probably this solution isn't very scalable, because it does to many queries, so if you adopt an url like http://site.com/ristorante/ricette/23/pollo.htm instead of http://site.com/ristorante/ricette/pollo.htm, you will save the reverse query, because the id is already present.


Snippets di Ruby on rails in Gedit

|

Gli snippet sono delle impalcature che permettono di velocizzare la scrittura del codice, Gedit le include come plugin e permette anche di farsene di personalizzate(vedi screencast).

L'idea viene presa da un editor molto comune tra gli sviluppatori in Ruby on Rails (che usano Mac) chiamato Textmate.

gedit snippets rails
 
il funzionamento è molto semplice, invece di scrivere tutto il costrutto si scrive la keyword principale o abbreviata, si preme tab e automaticamente ci si ritrova con il costrutto scritto, premendo <tab> si fà un salto direttamente alla posizione desiderata (Vedi screencast)

Non si tratta di autocompletamento che c'é nei mastodontici IDE come Eclipse, ma comunque rendono davvero veloce la scrittura del codice.

 

Creare gli snippet è facilissimo, bisogna solo stare attenti a fare l'escape di : ".
La sintassi è semplice $1 $2,.. corrispondono ai salti che vogliamo fare nel blocco di codice, primo <tab>, secondo <tab>, se poi vogliamo mettere un valore predefinito, che comunque può essere sovrascritto si usa ${1:variabile}.

Per esempio il for in si può fare così:

for ${1:nome_elemento} in ${2:nome_array}
    $3 ${1:element}
end
$0

Quindi scrivere:

for i in mio_array
print i
end

Diventa velocissimo, una volta fatto lo scheletro e impostato lo shortcut si salta tranquillamente nelle parti che servono, ovviamente una volta usciti dallo snippet si può sempre modificare il codice a proprio piacimento

Questi sono gli snippet di RoR/ActiveRecord che ho aggiunto alla sintassi di Ruby, potete installarli mettendo questo file nella cartella:

$HOME/.gnome2/gedit/snippets

 


Rails and Php on Apache without virtualhost


This is a simply hack to set up Apache with Ruby on Rails and PHP in the same tree.

I set up Apache+Rails following the wiki but then my php sites didn't work anymore, so I found this not for production way to have both together with a unique Apache installation and without virtual host(app1.host, app2.host).

So:

cd /var/www
rails railstest
cd railstest
script/generate controller prova 
<VirtualHost *>
ServerName localhost
DocumentRoot /var/www/
ErrorLog /var/log/apache2/error.log

<Directory /var/www/railstest/public>
Options ExecCGI FollowSymLinks
AddHandler fcgi-script .fcgi
AllowOverride all
Order allow,deny
Allow from all

</Directory>
</VirtualHost>

 Now restart apache and You will be able to access to your rails application with http://localhost/railstest/public/prova, if you don't want /public in the middle you can create symbolic links of public in /var/www (and call it railsapp)so You will be able to access to the controller with http://localhost/railsapp/prova and http://localhost/drupal-4.7-beta will work as usual

I've been surprised that ror on Apache is slower than  on Webrick(Ruby's webserver), I gonna try a real world solution.. probably this is a good point where to start.


Web 3.0? Come sarà il web del futuro?

|

Dopo il web 2.0 c'è già chi prova col 3.0, il web sta cambiando radicalmente e sempre più infretta; le tecnologie innovative già ci sono, adesso non resta che sincronizzarsi e migrare i contenuti.
Pagina statica -> pagina dinamica -> Applicazione web, sembra proprio essere questa l'evoluzione del web.


Ma dove poi questa rivoluzione?


Sembrerà banale, ma quando navighiamo su un sito e clicchiamo su un pulsante, tutta la pagina viene ricaricata; questo spreco/limitazione di risorse è stata da sempre una grande limitazione del protocollo web/http
Adesso grazie ad Ajax questo vincolo non c'è più e le applicazioni web di prossima generazione avranno poco da invidiare a quelle standalone e in alcuni casi le potranno addirittura rimpiazzare, vedi già gli editor WYSIWYG sul web.

Widget, trasparenze e interattivività ovunque, la tentazione sarà quella di offrire servizi e non più programmi, ma a quel punto ci sarà la GPL 4.0

PS: Anche i CMS dovranno aggiornarsi, per adesso ho trovato solo RailFrog(è ancora un embrione, ma é in stile Drupal) che supporta nativamente ajax, tramite ruby on rails


Programmare server e client con Ruby


Anche l'IBM si accorge delle grandi potenzialità di questo linguaggio multipiattaforma completamente ad oggetti.
Il documento tratta la programmazione dei socket, che possono essere utilizzati per la programmazione di rete, e fa alcuni esempi su come interfacciarsi sui protocolli più comuni.

Se siete nuovi a Ruby vi consiglio anche il mini-corso di Schroeder


Syndicate content