Generatore di applicazioni Rails 3.1

Con la fantasia e originalità che sempre mi contraddistingue (colpo di
tosse), l’ho chiamato leonardo come il famoso genio tutto fare del tardo
rinascimento. Sul mio blog un breve tutorial:

http://mastrodonato.info/index.php/2011/08/leonardo-generatore-di-applicazioni-rails-3-1/

Per ora mi va bene così e lo condivido con tutti voi nell’eventualità
che possa tornare utile a qualcuno. Appena avrò altro tempo lo
svilupperò

Ciao

Mi sembra interessante, pensi di sviluppare una interfaccia web anche
per le migrazioni e gestione automatica delle gem? Se usi Isolate invece
di Bundler ti installa le dipendenze lui, senza dover dare nessun
comando.

Io avevo iniziato a fare un programma, con sinatra, per generare una
applicazione da una ‘metadescrizione’, cioe` una Hash strutturata con i
model, l’aspetto di visualizzazione dei dati (campo -> controllo form)
etc…

Quello che hai fatto te eun approccio diverso, e un generatore di
codice RoR il quale, quando il programma ha raggiunto il limite delle
flessibilitapuo essere sviluppato ulteriormente do uno sviluppatore
Rails.

Ciao,
il progetto è rivolto agli sviluppatori quindi credo rimarrà un
generatore da console. Non genera un applicazione finita ma uno
scheletro di partenza da sviluppare, meno nudo dello scaffold ma
richiede la mano finale. Non ho molta fede negli altri tipi di prodotti
perchè poco flessibili anche se sarei felice di cambiare opinione.

2011/8/23 Marco M. [email protected]:

Ciao,
il progetto rivolto agli sviluppatori quindi credo rimarr un
generatore da console. Non genera un applicazione finita ma uno
scheletro di partenza da sviluppare, meno nudo dello scaffold ma
richiede la mano finale. Non ho molta fede negli altri tipi di prodotti
perch poco flessibili anche se sarei felice di cambiare opinione.

io sono riuscito a raggiungere i limit di rails_admin activeadmin (che
comunque fatto discretamente imho) e mezza dozzina di altri in due
ore, avessi rilasciato il tuo generatore due mesi fa ti avrei dato pi
feedback :slight_smile:

Domanda veloce: come gestisci le associazioni?
E gli upload?

Per qualche ragione a me ignota tutte le interfacce di
amministrazione automatica tendono a
a) usare una select per le associazioni. Bello, finch hai < 100
record possibili da associare…
b) scordarsi che possibile fare upload di file

PS: il passato di “choose” “chose” non “chosed” :wink:


twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: cascaad.com www.circleme.com

2011/8/24 Marco M. [email protected]:

gabriele renzi wrote in post #1018084:
Per non avere select con troppi dati, in genere io
uso qualche filtro per proporre scelte pi piccole ad es. se devi
scegliere la provincia puoi prima chiedere la regione e ridimensionare
la select via ajax. Tu avevi qualche idea?

io preferisco input box + autosuggest (sta in jquery ui o tools, non
mi ricordo mai) + callback che include un hidden field, anche non
avendo un sistema particolarmente smart per la search (es: “like
‘foo%’” in sql ok).
Questo per l’associazione singola, bottoncino “add more” per quelle
multiple.
E’ relativamente semplice da automatizzare come generazione, rispetto
alla select richiede un po’ di aiuto dal controller, ma imo una
soluzione ok.

Sto rilasciando un fix ma dopo di questo volevo migliorare qualcosina
come
la sezione test nella quale manca ancora l’autenticazione e la sezione
ajax che pensavo di colmare con capibara+selenium. Volevo anche
introdurre jquery ui.

fico :slight_smile:


twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: cascaad.com www.circleme.com

gabriele renzi wrote in post #1018084:

io sono riuscito a raggiungere i limit di rails_admin activeadmin (che
comunque fatto discretamente imho) e mezza dozzina di altri in due
ore, avessi rilasciato il tuo generatore due mesi fa ti avrei dato pi
feedback :slight_smile:

Domanda veloce: come gestisci le associazioni?
E gli upload?

Per qualche ragione a me ignota tutte le interfacce di
amministrazione automatica tendono a
a) usare una select per le associazioni. Bello, finch hai < 100
record possibili da associare…
b) scordarsi che possibile fare upload di file

PS: il passato di “choose” “chose” non “chosed” :wink:

Ops, grazie per la segnalazione :slight_smile:

Riguardo le associazioni: al momento non le gestisco ma di default viene
incluso formtastic che le gestisce tramite select. Non è semplice
trovare un sistema che vada bene per tutto, per questo scrivevo che
serve la mano finale. Per non avere select con troppi dati, in genere io
uso qualche filtro per proporre scelte più piccole ad es. se devi
scegliere la provincia puoi prima chiedere la regione e ridimensionare
la select via ajax. Tu avevi qualche idea?
Sto rilasciando un fix ma dopo di questo volevo migliorare qualcosina
come
la sezione test nella quale manca ancora l’autenticazione e la sezione
ajax che pensavo di colmare con capibara+selenium. Volevo anche
introdurre jquery ui.

Mi sembra una buona soluzione, è molto più complessa di una select ma è
anche più vantaggioso ottenerla “gratis” dal generatore ed eventualmente
sostituirla con una select quando conviene quella. Ci penso, grazie per
il consiglio :slight_smile:

Stavo implementando il supporto per rspec ed aggiornare i test per
l’autenticazione. Per testare la sezione ajax utilizzo
capybara+selenium, il driver funziona molto bene con firefox anche su
windows (cosa abbastanza rara) per cui ho scelto questa accoppiata. Ho
qualche indecisione se utilizzare le fixtures o factory girl che non ho
mai usato ma sembra molto valido, che dite?

Il 31/08/2011 10:35, Marco M. ha scritto:

qualche indecisione se utilizzare le fixtures o factory girl che non ho
mai usato ma sembra molto valido, che dite?

personalmente con factory_girl mi trovo benissimo :stuck_out_tongue:

A.

Sembra molto comodo ma il dubbio che ho è quando si ha a che fare con
tanti dati e tante tabelle. Rimane gestibile o sono più leggibili dati
sistemati dentro files yaml ?

assolutamente, ti incollo un pezzo di codice per renderti l’idea:

genera sequenze, es: user1, user2, etc…

Factory.sequence :username do |n|
“user#{n}”
end

models

Factory.define :user do |u|
u.name { Factory.next :username }
end

Factory.define :project do |p|
p.name { Factory.next :name } # => genero un nome univoco
p.user { Factory :user }
end

Factory.define :unit do |u|
u.project { Factory :project }
u.description { “bla bla bla” }
u.started_at { Time.now }
end

come, puoi vedere, in un solo file ho inserito dati e tabelle senza
particolari
problemi, con tanto di generatore di sequenze. c’ chi usa file separati,
ma
dipende da gusti ed esigenze.

posso sovrascrivere le impostazioni durante i test, per esempio:

@user = Factory.create(:user, :name => ‘pippo’)
@project = Factory(:project, :user => @user) # => stessa cosa, senza
chiamare il
metodo #create

genero un’istanza non salvata, utile per testare le validazioni

@modello = Factory.build :user

sinceramente, farsi gli YAML a mano lo trovo noioso e poco leggibile (a
prescindere che vengono creati dai generatori di rails). preferisco
scrivere
codice ruby :wink:

ciao,
A.

Il 31/08/2011 11:53, Marco M. ha scritto:

ciao Marco,

non ho ben chiaro il codice di cui stai parlando. in teoria, dovrebbe
bastare
riaprire la classe del generatore di default e ridefinire il metodo.

hai la possiblit di mostrare il codice per intero (magari un branch di
sviluppo
a parte) ?

A.

Il 01/09/2011 12:59, Marco M. ha scritto:

Provo ad allegarlo, se hai installato rspec-rails lo puoi anche trovare
in questo path:

[ruby
path]\lib\ruby\gems\1.8\gems\rspec-rails-2.6.1\lib\generators\rspec\scaffold\scaffold_generator.rb

Ho anche fatto il tentativo di spostare l’override col codice sopra in
/lib/scaffold_generator.rb => Niente

(ho anche aggiornato config.autoload_paths in config/application.rb)

ho spostato i templates sotto lib/templates/rspec/scaffold => Questo è
OK

Grazie per gli esempi, in effetti semplifica la vita e per questo motivo
l’ho inserito.

Ora invece un problemino sul quale mi sono scontrato già in un passato
recente:
qualche idea su come si possa estendere un generatore senza doverlo per
forza sostituire?

Per modificare le spec delle viste spec/views/risorsa/*_rspec.rb devo
modificare la def value_for nel generatore per cui, come al solito, le
cose si complicano.

Per modificare rspec riesco solo modificando l’intero generatore
dedicato allo scaffold (o leosca nel mio caso) che però è abbastanza
invasivo e mi costringe a continui allineamenti. Io vorrei solo fare
l’override di quella def come una comune classe e con un qualcosa del
genere:

require ‘generators/rspec’
require ‘rails/generators/resource_helpers’

module Rspec
module Generators
class ScaffoldGenerator

  (quà c'era la parte che non volevo modificare, sotto la def 

modificata)

  protected

    def value_for(attribute)
      case attribute.type
      when :string
        "#{attribute.name.titleize}".inspect
      when :boolean
        "Ico_x".inspect
      else
        attribute.default.inspect
      end
    end

end

end
end

Non viene trovato il generatore
error rspec [not found]

Se eredita da Base lo trova ma lo sostituisce ed ovviamente non funziona
più una fava.

hai provato a creare un file tipo:

[tua_app]/lib/rspec-rails/generators/rspec/rspec_generator.rb

contenente:

class RspecGenerator < Rails::Generator::Base
  [... tuo codice .. ]
end

quando chiami il generatore di rspec, dovrebbe caricare anche il tuo
file per
ultimo, che a sua volta dovrebbe riaprire la classe ed inserire il
codice che ti
serve.

un altro approccio pi semplice potrebbe essere quello di scriverti un
modulo
separato, ed estendere il generatore di rspec. in questo caso stai
ribaltando la
logica che avevi adottato: anzich estendere il tuo generatore con quello
di
rspec, fai il contrario :wink:

A.

Il 01/09/2011 14:29, Marco M. ha scritto:

Grazie Andrea per la pazienza ma non funziona, ho provato anche i
percorsi che mi hai suggerito ma l’unico che rileva è
/[app path]/lib/generators/rspec/scaffold/scaffold_generator.rb

L’estensione è questa:

require ‘generators/rspec’
require ‘rails/generators/resource_helpers’

class ScaffoldGenerator

protected

def pippo
“pippo”
end

end

nella vista utilizzo il metodo pippo ma non viene nemmeno elaborata
perchè sembra che il generatore venga sostituito con la mia estensione
ed in pratica risulta vuoto.

Se invece eseguo il generatore originale viene sollevato l’errore del
metodo pippo che non rileva.

Purtroppo non ho altro tempo, creo la def dentro la vista e vada via il
ciapet

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 24/08/2011 22:16, gabriele renzi wrote:

avendo un sistema particolarmente smart per la search (es: “like
‘foo%’” in sql ok).
Questo per l’associazione singola, bottoncino “add more” per quelle multiple.
E’ relativamente semplice da automatizzare come generazione, rispetto
alla select richiede un po’ di aiuto dal controller, ma imo una
soluzione ok.

Per fare questo con le select singole e multiple uso recordselect, nelle
versioni rails 2.x e 3.x manutenute da scambra e vhochstein, la versione
di
vhochstein usa jquery.

Per le associazioni multiple con subform faccio come dice ryanb:

Ma non sono molto soddisfatto, se qualcuno avesse qualche idea
aggiuntiva da
esaminare sarei interessato.

Per il discorso sulle interfacce di amministrazioni automatiche nomino
activescaffold: come altri non genera codice e personalmente lo uso
dagli albori
di rails 2 quando aveva appena spesso di chiamarsi ajaxscaffold.

Si: supporta gli upload e tutte le relazioni di activerecord pi o meno
facilmente, secondo me scritto molto bene e meriterebbe uno sforzo
comunitario
maggiore, prima c’era ma adesso mi sembra si sia perso con il fork di
vhochstein
che per l’unico che funziona su 3.x

Link all’API per i curiosi:

Le mie 2 monetine.

Saluti,
Antonio B.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iQEcBAEBAgAGBQJOYj0lAAoJELgLplTPZUF9FnwIAI/rlTOiEK+v62f5Q/tPekny
xeNLxJC5N2I8FVAE2aKOU88PDeuFbyEyD3Ea9iHbHCg5Q3g/8QFqNNx6xrWX7MRy
+55AdOb3kkZFEltAeF4ySnK0sCAwa+7KqrTTBMCooIMlH30GnupR9sAwnCmeAJi+
16GBLKC6yv9Xnmm8aqMEfB0y8c295mCe5yluCFV+2ZKLaO9ifs/pQAjnA/32T8fc
bSFzY528hOrxu99UkSSKbi+5yv1/OLZRhp+lyqKZJOc7MsZhtR8M+pWA5FV/ktTy
L1cjpwZpdLYUzDUz4cV9NgsFR+hnV6rRfmxt4XAuVOfN44GSQ5fGZfaPJaJ5JC8=
=t+rn
-----END PGP SIGNATURE-----

Ho aggiornato il generatore alla versione 1.6 introducendo il supporto
alle risorse nidificate:

http://marco.mastrodonato.info/2011/09/leonardo-un-generatore-di-applicazioni.html

sto anche spostando il mio blog verso blogger (link sopra)

sto provando il generatore di applicazioni leonardo . mi è piaciuto
molto perchè genera tantissimo codice, un’ interfaccia accattivante
etc .
Ho trovato un modo “semplice” per ordinare i campi di una view al
sito :
http://it.asciicasts.com/episodes/228-colonne-di-tabelle-ordinabili.

sono molto grato se potessi capire dove inserire queste poche righe di
codice per poterle utilizzare in ogni view generata da leonardo.

fstilo

Grazie per il consiglio sulle associazioni, a breve gli darò
un’occhiata. Attualmente sto implementando le risorse nidificate e sto
anche rivedendo tutto il codice.

Io non amo le interfacce da amministrazione, introducono una doppia
manutenzione che spesso causa disallineamenti e le versioni “attive” che
lavorano “al volo” tipo activescaffold (anche se una delle prime
versioni) vanno bene fin quando non ci devi mettere mano. Forse non è
sempre fattibile, ma io preferisco le integrazioni in un’unica
interfaccia con un’unica gestione dei ruoli.