Creare dei campi di modifica dinamici con l' InplaceEditor

Posted by Dibi Store Tue, 28 Aug 2007 22:06:00 GMT

Una delle cose che piu mi piace nelle applicazioni web 2.0, è la possibilità di poter aggiornare in tempo reale i nostri dati, semplicemente cliccando sul rispettivo valore.

Con ruby on rails e ajax, tutto questo è molto semplice

Per realizzare l'esperimento, ci serviremo di ruby on rails e la libreria prototype, scaricabile gratuitamente, in accoppiata alla mitica script.aculo.us.

Innanzitutto creiamo una nuova migration con i seguenti valori:

class AddContactsTable < ActiveRecord::Migration
  def self.up
    create_table :contacts do |t|
      t.column :name, :string
      t.column :email, :string
      t.column :phone, :string
      t.column :address_line1, :string
      t.column :address_line2, :string
    end
  end
  def self.down
    drop_table :contacts
  end
end

Ora, per il nostro semplice esempio, possiamo servirci di scaffold per generare le viste e il controller:

ruby script/generate scaffold Contact

A questo punto, aggiungiamo pure qualche contatto, connettendoci a dominio/contact/new (ricordiamoci di avviare il server se necessario), che servirà a seguire meglio gli esempi.

E' ora arrivato il momento di entrare in azione! Recuperate in layout contact e aggiungete nell'header il seguente comando, che automaticamente includerà tutti i files necessari (e anche qualcuno in piu, ma il nostro esempio va piu che bene):

<%= javascript_include_tag :defaults %> 

Cosi facendo, includeremo nel nostro controller automaticamente la libreria prototype e script.aculo.us. Ora abbiamo bisogno di aprire il file in /app/views/contacts/show.rhtml, che di default appare cosi:

<% for column in Contact.content_columns %>
<p>
  <b><%= column.human_name %>:</b> <%=h @contact.send(column.name) %>
</p>
<% end %>
<%= link_to 'Edit' , :action => 'edit' , :id => @contact %> |
<%= link_to 'Back' , :action => 'list' %>

Quello che faremo (inizia la magia di rails), sarà innanzitutto togliere il link edit, in quanto con la tecnica dell'in place editing non sarà piu necessario, dopodiche effettueremo una chiamata per ogni campo verso l'inline helper. Ora il file dovrebbe essere cosi:

<% for column in Contact.content_columns %>
<p>
  <b><%= column.human_name %>:</b>
  <%= in_place_editor_field :contact, :name %>
</p>
<% end %>
<%= link_to 'Back', :action => 'list' %>

Quello che abbiamo fatto è semplice, si veda pure la documentazione per quanto riguarda le possibili opzioni. Ora, prima che vi apprestiate a provare il vostro nuovo gioiellino, c'è ancora una piccola modifica da fare, in quanto, ora come ora (potete provare) la modifica punta ad un azione inesistente. Per ovviare a cio creiamo una nuova azione nel controller contact:

Contact.content_columns.each do |column|
  in_place_edit_for :contact, column.name
end

Ora tutto dovrebbe funzionare correttamente, rimando alla seconda parte di questo articolo per la modifica in linea di altri elementi, e qualche consiglio utile in termini di usabilità.

Ciao 

Posted in  | Tags ,  | no comments

Comments

(leave url/email »)

   Preview comment