# Scrivere su file da model, restare dry è possibile?

**URL:** <https://www.ruby-forum.com/t/scrivere-su-file-da-model-restare-dry-e-possibile/202458>\
**Category:** IT\
**Created:** [January 29, 2011, 11:45pm UTC](https://www.ruby-forum.com/t/scrivere-su-file-da-model-restare-dry-e-possibile/202458 "2011-01-29T23:45:33Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![luislavena](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/0ea827/32.png) [@luislavena](https://www.ruby-forum.com/u/luislavena)\
**Post date:** [January 29, 2011, 11:45pm UTC](https://www.ruby-forum.com/t/scrivere-su-file-da-model-restare-dry-e-possibile/202458/1 "2011-01-29T23:45:33Z")

</div>

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](http://dominio.com)  
log\_file /var/log/dominio.com.log  
}

e una volta aggiunto un record, mi sostituisce [dominio.com](http://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!!

---

<div class="post-metadata">

**Author:** ![dino\_d](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b5ac83/32.png) [@dino\_d](https://www.ruby-forum.com/u/dino_d)\
**Post date:** [January 30, 2011, 11:11am UTC](https://www.ruby-forum.com/t/scrivere-su-file-da-model-restare-dry-e-possibile/202458/2 "2011-01-30T11:11:05Z")

</div>

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](http://dominio.com)  
> log\_file /var/log/dominio.com.log  
> }
> 
> e una volta aggiunto un record, mi sostituisce [dominio.com](http://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

---

<div class="post-metadata">

**Author:** ![dino\_d](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b5ac83/32.png) [@dino\_d](https://www.ruby-forum.com/u/dino_d)\
**Post date:** [January 30, 2011, 1:52pm UTC](https://www.ruby-forum.com/t/scrivere-su-file-da-model-restare-dry-e-possibile/202458/3 "2011-01-30T13:52:15Z")

</div>

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 🙂

---

<div class="post-metadata">

**Author:** ![dino\_d](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b5ac83/32.png) [@dino\_d](https://www.ruby-forum.com/u/dino_d)\
**Post date:** [January 31, 2011, 11:06am UTC](https://www.ruby-forum.com/t/scrivere-su-file-da-model-restare-dry-e-possibile/202458/4 "2011-01-31T11:06:53Z")

</div>

2011/1/30 maurizio de magnis [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> 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

---

<div class="post-metadata">

**Author:** ![dino\_d](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b5ac83/32.png) [@dino\_d](https://www.ruby-forum.com/u/dino_d)\
**Post date:** [January 31, 2011, 11:13pm UTC](https://www.ruby-forum.com/t/scrivere-su-file-da-model-restare-dry-e-possibile/202458/5 "2011-01-31T23:13:24Z")

</div>

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!

---

<div class="post-metadata">

**Author:** ![dino\_d](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b5ac83/32.png) [@dino\_d](https://www.ruby-forum.com/u/dino_d)\
**Post date:** [January 30, 2011, 4:58pm UTC](https://www.ruby-forum.com/t/scrivere-su-file-da-model-restare-dry-e-possibile/202458/6 "2011-01-30T16:58:31Z")

</div>

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](http://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](http://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](http://www.kuwata-lab.com/erubis/users-guide.02.html#tutorial)

Maurizio

Il 30 gennaio 2011 13:52, Dino D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

---

<div class="post-metadata">

**Author:** ![dino\_d](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b5ac83/32.png) [@dino\_d](https://www.ruby-forum.com/u/dino_d)\
**Post date:** [February 1, 2011, 11:51am UTC](https://www.ruby-forum.com/t/scrivere-su-file-da-model-restare-dry-e-possibile/202458/7 "2011-02-01T11:51:49Z")

</div>

Il 31 gennaio 2011 23:13, Dino D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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
