Scrivere su file da model, restare dry è possibile?

salve ragazzi.
avendo quasi finito il blog di prova per impararmi rails (ho dei
problemi sul routing), avrei intenzione di fare un bel progettino che
sia veramente utile. non so se mi sono presentato in precedenza, ma sono
un consulente informatico e seguo diversi server sui quali ho dei siti
web, quindi mi son detto: e se facessi un pannello di controllo?

ancora prima di pensarci però, mi è venuto in mente il primo ostacolo
(ho pure provato a saltarlo XD ): come si scrive su file? guardando in
giro ho visto la funzione File.open(ecc) ma non è ciò che mi serve, o
meglio, non come vorrei.

sostanzialmente, vorrei scrivere un file in base a ciò che una riga del
db contiene: ho un template, per esempio

sito{
alias dominio.com
log_file /var/log/dominio.com.log
}

e una volta aggiunto un record, mi sostituisce dominio.com con il record
che ho inserito. è una sorta di ‘parse file’ quello che voglio fare, ma
che riempie il file con delle stringhe contenute nel db.

aggiungo che vorrei scrivere un file IN UNA DETERMINATA DIRECTORY, non
nel path di rails.

mi son guardato mongodb con il rispettivo gridfs, ma non lo uso perchè
il supporto a fuse (per montarlo come filesystem) non è completamente
funzionante.

conto nel vostro aiuto, non vorrei lasciare il progetto in cantiere,
anche perchè ho intenzione, una volta terminato, di rilasciarlo sotto
licenza gpl: il mondo open source ha dato tanto a me, ora provo a
ricambiare.

ciao a tutti!!

Dino D. wrote in post #978429:

sostanzialmente, vorrei scrivere un file in base a ciò che una riga del
db contiene: ho un template, per esempio

sito{
alias dominio.com
log_file /var/log/dominio.com.log
}

e una volta aggiunto un record, mi sostituisce dominio.com con il record
che ho inserito. è una sorta di ‘parse file’ quello che voglio fare, ma
che riempie il file con delle stringhe contenute nel db.

Ciao Dino,

giuro che non ho capito quello che dovrebbe fare il tuo programma, ma la
parola DRY nel titolo del messaggio mi fa pensare che forse il punto
giusto dove intervenire sia ActiveRecord, se i tuoi modelli derivano da
quello. Estendere ActiveRecord con la funzionalità che ti serve ti
permette di chiamarla da tutti i modelli senza doverla implementare più
volte. Oppure ti crei un plugin/gemma/modulo che vai ad includere nei
modelli in cui serve.

Per quel che segue posso dirti due cose:

aggiungo che vorrei scrivere un file IN UNA DETERMINATA DIRECTORY, non
nel path di rails.

Non c’è problema, puoi scrivere file dove vuoi.

mi son guardato mongodb con il rispettivo gridfs, ma non lo uso perchè
il supporto a fuse (per montarlo come filesystem) non è completamente
funzionante.

gridfs serve a scrivere dati non nel db ma su file, dato che mongodb ha
un limite sulla dimensione degli oggetti che può memorizzare
internamente.
Per Rails esistono un po’ di gemme che gestiscono casi simili e quella
che sembra andare per la maggiore è paperclip. Un uso tipico è
memorizzare su file system le immagini caricate dagli utenti, magari
anche ridimensionandole e conservandole in più versioni (integrazione
con imagemagick). Lo configuri dentro il modello ed il gioco è fatto
perché pensa lui a tutto.

Paolo

ciao paolo.
ti spiego quello che mi serve, paperclip e il resto non mi serve perchè
non devo fare l’upload di alcun file, ma scrivere su un file.
in poche parole, ho un file su /etc/programma/file.conf
ho un model ‘site’ con dominio:string

il file /etc/programma/file.conf è così strutturato

direttiva{
alias xxxxxx
log_file /var/log/xxxxxx.log
}

se il file file.conf non esiste l’applicazione me lo dovrebbe creare.
vorrei sostituire xxxxx con ‘site.dominio’. come faccio? quale
procedimento seguire?

precisazione: a differenza di voi io non sono un programmatore, quindi
creare un plugin o una gemma per me è impensabile, non mi passa neanche
per l’anticamera del cervello :slight_smile:

2011/1/30 maurizio de magnis [email protected]

Ciao, puoi sfruttare un template engine o andare giu’ grezzo con
String#gsub.

In un progetto ho gestito il deployment di webapp php/ruby sotto
linux/apache e ho dovuto anche scrivere file di configurazione
personalizzati e come sistema di templating ho trovato comodo Erubis.

Personalmente se fosse una applicazione rails userei erb: probabilmente
e’
leggermente meno potente e veloce di erubis, ma e’ gia’ incluso in
rails.
Per il resto d’accordissimo con le tue considerazioni: a sentire la
descrizione iniziale del problema, tutto quello che serve e’ un sistema
di
templating!

Ciao

ciao!! maurizio ha azzeccato proprio quello che mi serve, però prima di
iniziare a scrivere codice vorrei sapere come utilizzare gli erb al
posto di eruby, cioè aprire/scrivere file utilizzando un erb come
template, visto che è già integrato in rails (come dice Luca). avete
esempi di codice o risorse utili? ho cercato e continuo a cercare su
google ma non riesco a trovare niente di realmente utile.

poi, seguendo il modello mvc i files non dovrebbero essere il ‘model’?
dal sito di eruby vedo che il codice che mi ha postato maurizio va
scritto nel controller. non metto in dubbio il suo funzionamento o la
soluzione di maurizio, ma così non si rischia di andare contro
all’architettura MVC?

grazie ragazzi!

Ciao, puoi sfruttare un template engine o andare giu’ grezzo con
String#gsub.

In un progetto ho gestito il deployment di webapp php/ruby sotto
linux/apache e ho dovuto anche scrivere file di configurazione
personalizzati e come sistema di templating ho trovato comodo Erubis.

Nel tuo caso puoi salvare in un posto il template di base:

/var/file.conf.erubis:
direttiva {
alias <%= dominio %>
log_file /var/log/<%= dominio %>.log
}

e al momento della creazione del file personalizzato puoi fare piu’ o
meno cosi’:

site = Site.find(42)

supponiamo che site.dominio restituisca “awesomedomain.com

require ‘erubis’
template_path = “/var/file.conf.erubis”
template = File.read(template_path)
template_vars = {:dominio => site.dominio}
content = Erubis::Eruby.new(template).result(template_vars)

a questo punto content e’ una stringa contenente:

direttiva {
alias awesomedomain.com
log_file /var/log/awesomedomain.com.log
}

output_path = “/var/#{site.dominio}/file.conf”
File.open(output_path, ‘w’) do |file|
file.write(content)
end

ed ora /var/awesomedomain.com/file.conf e’ stato scritto su disco

fonte: http://www.kuwata-lab.com/erubis/users-guide.02.html#tutorial

Maurizio

Il 30 gennaio 2011 13:52, Dino D. [email protected] ha scritto:

Il 31 gennaio 2011 23:13, Dino D. [email protected] ha scritto:

ciao!! maurizio ha azzeccato proprio quello che mi serve, per prima di
iniziare a scrivere codice vorrei sapere come utilizzare gli erb al
posto di eruby, cio aprire/scrivere file utilizzando un erb come
template, visto che gi integrato in rails (come dice Luca).

Rails usa ERB per restituire una risposta personalizzata alle richieste
web.

Di solito quindi arriva una richiesta HTTP per una risorsa (/sites/42)
e viene usato un template ERB per restituire al client del codice HTML
che poi visualizzera’ sul suo browser.

Che io sappia, non c’e’ alcun tipo di strumento nativo di Rails che ti
permetta di usare i templates ERB per scrivere su file.

Nel tuo caso usare ERB o Erubis e’ praticamente la stessa cosa: gli
engine sono pressoche’ intercambiabili.

poi, seguendo il modello mvc i files non dovrebbero essere il ‘model’?
dal sito di eruby vedo che il codice che mi ha postato maurizio va
scritto nel controller. non metto in dubbio il suo funzionamento o la
soluzione di maurizio, ma cos non si rischia di andare contro
all’architettura MVC?

Nell’implementazione di MVC di Rails la richiesta del client viene
instradata dal sistema di routing verso il metodo di in Controller il
quale si preoccupa di contattare tutti i Models responsabili dei dati
richiesti per formare la risposta che verra’ restituita al client
personalizzando un template (la View).

Suppongo che il tuo pannello di controllo debba rispondere alla
richiesta di istanziare il file di configurazione all’atto (tiro ad
indovinare) della creazione del sito/dominio.
Questo significa che la richiesta del client viene gestita da un
controller il quale poi puo’ richiedere al/ai model/s di effettuare le
operazioni “di basso livello” come scrivere quel file di
configurazione.

Nessuno ti vieta di aggiungere un metodo alla classe Site:

class Site

def create_configuration_file
template_path = “/var/file.conf.erubis”
template = File.read(template_path)
template_vars = {:dominio => self.dominio}
content = Erubis::Eruby.new(template).result(template_vars)
output_path = “/var/#{self.dominio}/file.conf”
File.open(output_path, ‘w’) do |file|
file.write(content)
end
end
end

e in caso di aggiungere un filtro:

class Site
after_create :create_configuration_file

end

cosi’ nel tuo SitesController all’atto della creazione del sito,
otterrai automaticamente la scrittura del file di configurazione sul
filesystem.

A questo punto ti manca solo da aggiungere la libreria “erubis” nel
Gemfile che si trova nella root della tua applicazione Rails
(supponendo che tu stia usando Bundler, ovviamente):

$ echo “gem ‘erubis’” >> Gemfile
$ bundle install

Maurizio