# Problemi con attachment\_fu, ajax e responds\_to\_parent

**URL:** <https://www.ruby-forum.com/t/problemi-con-attachment-fu-ajax-e-responds-to-parent/156915>\
**Category:** IT\
**Created:** [January 5, 2009, 9:40am UTC](https://www.ruby-forum.com/t/problemi-con-attachment-fu-ajax-e-responds-to-parent/156915 "2009-01-05T09:40:45Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![fixxxer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/ea666f/32.png) [@fixxxer](https://www.ruby-forum.com/u/fixxxer)\
**Post date:** [January 5, 2009, 9:40am UTC](https://www.ruby-forum.com/t/problemi-con-attachment-fu-ajax-e-responds-to-parent/156915/1 "2009-01-05T09:40:45Z")

</div>

Sto cercando di uploadare file di immagini via ajax form.  
Tentando di usare attachment\_fu con un form Ajax mi sono scontrato col  
problema dell’accesso di js al file system, e ho presto trovato la  
“soluzione” via responds\_to\_parent e iframe:

[http://khamsouk.souvanlasy.com/2007/5/1/ajax-file-uploads-in-rails-using-attachment\_fu-and-responds\_to\_parent](http://khamsouk.souvanlasy.com/2007/5/1/ajax-file-uploads-in-rails-using-attachment_fu-and-responds_to_parent)

Ho perÃ² due problemi:

1. l’action .js che risponde al form non include prototype  
(Element.update is not a function) Come faccio a “iniettarlo” ? (stesso  
problema degli ultimi 2 commenti al post sopra)

2. con quell’impostazione come faccio a degradare in assenza di js ?

Forse esiste qualche soluzione alternativa ?

Grazie, Matteo.

---

<div class="post-metadata">

**Author:** ![fixxxer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/ea666f/32.png) [@fixxxer](https://www.ruby-forum.com/u/fixxxer)\
**Post date:** [January 5, 2009, 11:00am UTC](https://www.ruby-forum.com/t/problemi-con-attachment-fu-ajax-e-responds-to-parent/156915/2 "2009-01-05T11:00:27Z")

</div>

On Mon, Jan 5, 2009 at 9:40 AM, Matteo F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> (Element.update is not a function) Come faccio a “iniettarlo” ? (stesso  
> problema degli ultimi 2 commenti al post sopra)
> 
> 1. con quell’impostazione come faccio a degradare in assenza di js ?
> 
> Forse esiste qualche soluzione alternativa ?
> 
> Grazie, Matteo.

ciao,  
se ho ben capito il problema io ho fatto  
così:  
respond\_to do |format|  
if @pdffile.save  
session[:pdf] = @pdffile.full\_filename  
flash.now[:notice] = ‘il file "’ + @pdffile.filename + ‘" è  
stato caricato correttamente’  
format.js do  
responds\_to\_parent do  
render :update do |page|  
page.replace(“messages”, :partial =\> “msg”)  
page.replace\_html(“form\_file”, :partial =\> “form\_file”)  
page[“webfaxpdf”].disable  
page[“webfaxform”].enable  
end  
end  
end  
else  
…  
end  
end

fonte d’ispirazione:

> **[In-place file upload with Ruby on Rails | Dmytro Shteflyuk's Home](https://kpumuk.info/ruby-on-rails/in-place-file-upload-with-ruby-on-rails/)**
>
> My friends often asked me how to upload file using AJAX, and usually they got answer "in no way". Correct answer, but what if I need to upload file without full page reloading? And, of course, I want to use RJS in this case. Here I'll explain what to...

---

<div class="post-metadata">

**Author:** ![fixxxer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/ea666f/32.png) [@fixxxer](https://www.ruby-forum.com/u/fixxxer)\
**Post date:** [January 5, 2009, 11:43am UTC](https://www.ruby-forum.com/t/problemi-con-attachment-fu-ajax-e-responds-to-parent/156915/3 "2009-01-05T11:43:21Z")

</div>

Piccini R. wrote:

> On Mon, Jan 5, 2009 at 9:40 AM, Matteo F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> wrote:
> 
> > (Element.update is not a function) Come faccio a “iniettarlo” ? (stesso  
> > problema degli ultimi 2 commenti al post sopra)
> > 
> > 1. con quell’impostazione come faccio a degradare in assenza di js ?
> > 
> > Forse esiste qualche soluzione alternativa ?
> > 
> > Grazie, Matteo.
> 
> ciao,  
> se ho ben capito il problema io ho fatto  
> cosï¿½:  
> respond\_to do |format|  
> if @pdffile.save  
> session[:pdf] = @pdffile.full\_filename  
> flash.now[:notice] = ‘il file "’ + @pdffile.filename + ‘" ï¿½  
> stato caricato correttamente’  
> format.js do  
> responds\_to\_parent do  
> render :update do |page|  
> page.replace(“messages”, :partial =\> “msg”)  
> page.replace\_html(“form\_file”, :partial =\> “form\_file”)  
> page[“webfaxpdf”].disable  
> page[“webfaxform”].enable  
> end  
> end  
> end  
> else  
> …  
> end  
> end
> 
> fonte d’ispirazione:  
> [http://kpumuk.info/ruby-on-rails/in-place-file-upload-with-ruby-on-rails/](http://kpumuk.info/ruby-on-rails/in-place-file-upload-with-ruby-on-rails/)

Infatti anch’io ho fatto nello stesso modo, solo che qualcosa sembra  
andare storto perchÃ¨ quando chiama la funzione prototype per aggiornare  
il partial prototype non Ã¨ caricato…

saresti cosÃ¬ gentile da mandare anche il template col form e l’iframe ?

Riguardo alla questione 2) come gestisci la mancanza di js sul browser ?

Grazie. Matteo

---

<div class="post-metadata">

**Author:** ![fixxxer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/ea666f/32.png) [@fixxxer](https://www.ruby-forum.com/u/fixxxer)\
**Post date:** [January 5, 2009, 1:11pm UTC](https://www.ruby-forum.com/t/problemi-con-attachment-fu-ajax-e-responds-to-parent/156915/4 "2009-01-05T13:11:12Z")

</div>

Piccini R. wrote:

> 2009/1/5 Matteo F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > > > Grazie, Matteo.  
> > > > format.js do  
> > > > …  
> > > > saresti cosÃ¬ gentile da mandare anche il template col form e l’iframe ?
> > 
> > Riguardo alla questione 2) come gestisci la mancanza di js sul browser ?
> > 
> > ## Grazie. Matteo
> 
> forse ti manca il :format =\> ‘js’ nel campo :url del form, comunque  
> ecco il template del form:
> 
> \<% form\_for(:pdffile, :url =\> { :action =\> ‘pdf\_upload’, :format =\>  
> ‘js’ }, :html =\> { :id =\> “webfaxpdf”, :multipart =\> true, :target =\>  
> ‘upload\_frame’ }) do |f| -%\>
> 
> Passo 1:
> 
> \<%= f.error\_messages :header\_message =\> “Errore nell’inserimento  
> dati”, :message =\> "Riepilogo errori: " %\>
> 
> - \<%= f.label :uploaded\_data, "file da caricare: " %\>\<%= f.file\_field :uploaded\_data %\> 
> 
> \<%= f.submit 'carica file' %\> \<% end -%\>

Non capisco, Ã¨ da stanotte che continuo a guardare action e template e  
tutto sembra a posto…

Che Rails usi ? In effetti giÃ avevo dovuto usare

page \<\< “Effect.BlindUp(‘new\_item’, {duration: 0.5});”  
page.delay(0.6){

in un .rjs . Magari Ã¨ Rails 2.1.1 …

> per quanto riguarda il degradare non l’ho risolto neanche io, perÃ²  
> essendoci l’iframe firefox (non l’ho ancora testato su altri browser)  
> fa partire il suo loader come per un refresh della pagina…magra  
> consolazione lo so ma almeno l’utente vede che sta succedendo  
> qualcosa…

L’unica idea che mi viene in mente Ã¨ di lasciare il form normale senza  
:format =\> ‘js’ e poi via js modificarlo al caricamento del template.  
Appena risolvo l’altro problema ci provo.

---

<div class="post-metadata">

**Author:** ![fixxxer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/ea666f/32.png) [@fixxxer](https://www.ruby-forum.com/u/fixxxer)\
**Post date:** [January 5, 2009, 12:31pm UTC](https://www.ruby-forum.com/t/problemi-con-attachment-fu-ajax-e-responds-to-parent/156915/5 "2009-01-05T12:31:25Z")

</div>

2009/1/5 Matteo F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > > Grazie, Matteo.  
> > > format.js do  
> > > …  
> > > saresti cosÃ¬ gentile da mandare anche il template col form e l’iframe ?
> 
> Riguardo alla questione 2) come gestisci la mancanza di js sul browser ?
> 
> ## Grazie. Matteo

forse ti manca il :format =\> ‘js’ nel campo :url del form, comunque  
ecco il template del form:

\<% form\_for(:pdffile, :url =\> { :action =\> ‘pdf\_upload’, :format =\>  
‘js’ }, :html =\> { :id =\> “webfaxpdf”, :multipart =\> true, :target =\>  
‘upload\_frame’ }) do |f| -%\>

Passo 1:

\<%= f.error\_messages :header\_message =\> “Errore nell’inserimento  
dati”, :message =\> "Riepilogo errori: " %\>

- \<%= f.label :uploaded\_data, "file da caricare: " %\>\<%= f.file\_field :uploaded\_data %\> 

 \<%= f.submit 'carica file' %\> \<% end -%\>

per quanto riguarda il degradare non l’ho risolto neanche io, perÃ²  
essendoci l’iframe firefox (non l’ho ancora testato su altri browser)  
fa partire il suo loader come per un refresh della pagina…magra  
consolazione lo so ma almeno l’utente vede che sta succedendo  
qualcosa…

---

<div class="post-metadata">

**Author:** ![fixxxer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/ea666f/32.png) [@fixxxer](https://www.ruby-forum.com/u/fixxxer)\
**Post date:** [January 5, 2009, 1:15pm UTC](https://www.ruby-forum.com/t/problemi-con-attachment-fu-ajax-e-responds-to-parent/156915/6 "2009-01-05T13:15:23Z")

</div>

On Mon, Jan 5, 2009 at 1:11 PM, Matteo F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> > > –
> > 
> > \<%= f.submit 'carica file' %\>
> 
> Che Rails usi ? In effetti già avevo dovuto usare
> 
> ## L’unica idea che mi viene in mente è di lasciare il form normale senza :format =\> ‘js’ e poi via js modificarlo al caricamento del template. Appena risolvo l’altro problema ci provo.

uso rails 2.1.1

---

<div class="post-metadata">

**Author:** ![fixxxer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/ea666f/32.png) [@fixxxer](https://www.ruby-forum.com/u/fixxxer)\
**Post date:** [January 7, 2009, 8:38am UTC](https://www.ruby-forum.com/t/problemi-con-attachment-fu-ajax-e-responds-to-parent/156915/7 "2009-01-07T08:38:27Z")

</div>

ciao,  
il problema 2 l’ho risolto attaccando un observer all’evento onclick  
del bottone di submit del form. questo perÃ² l’ho fatto via javascript  
perchÃ¨ gli helper di rails mi permettono di agganciare un observer  
solo a elementidi input e non a qualsiasi elemento come invece mi  
permette di fare prototype

al caricamento del form:  
page.call(‘clicktoload’, ‘pdffile\_submit’)  
dove pdffile\_submit Ã¨ l’id del bottone di submit del form

e in application.js:  
function clicktoload(elem)  
{  
$(elem).observe(‘click’, function(event){startLoad();});  
}  
dove startLoad Ã¨ una funzione che mi fa partire un loader

poi nella action di risposta al form occorre fermare il loader

2009/1/5 Matteo F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

---

<div class="post-metadata">

**Author:** ![fixxxer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/ea666f/32.png) [@fixxxer](https://www.ruby-forum.com/u/fixxxer)\
**Post date:** [January 5, 2009, 1:40pm UTC](https://www.ruby-forum.com/t/problemi-con-attachment-fu-ajax-e-responds-to-parent/156915/8 "2009-01-05T13:40:18Z")

</div>

Piccini R. wrote:

> On Mon, Jan 5, 2009 at 1:11 PM, Matteo F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> wrote:
> 
> > > > –
> > > 
> > > \<%= f.submit 'carica file' %\>
> > 
> > Che Rails usi ? In effetti giï¿½ avevo dovuto usare
> > 
> > ## L’unica idea che mi viene in mente ï¿½ di lasciare il form normale senza :format =\> ‘js’ e poi via js modificarlo al caricamento del template. Appena risolvo l’altro problema ci provo.
> 
> uso rails 2.1.1

Boh. Per ora mollo che mi si rinfreschino i neuroni.

Grazie molte comunque.

Matteo

---

<div class="post-metadata">

**Author:** ![fixxxer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/ea666f/32.png) [@fixxxer](https://www.ruby-forum.com/u/fixxxer)\
**Post date:** [February 14, 2009, 12:20pm UTC](https://www.ruby-forum.com/t/problemi-con-attachment-fu-ajax-e-responds-to-parent/156915/9 "2009-02-14T12:20:44Z")

</div>

Sono tornato sul problema dopo un bel pÃ² con la mente fresca e un pÃ² di  
pace intorno e finalmente ho risolto tutto.

Quanto al problema 1) era probabilmente qualche erroraccio sciocco  
relativo al target (l’iframe), rimettendo i pezzi in ordine Ã¨ andato  
tutto a posto.

Quanto al problema 2), come degradare in assenza di js, ho risolto cosÃ¬:

nelle view i form li ho lasciati senza l’attributo target e il .js  
dell’action:

\<% form\_for item, item, :url =\> { :action =\> “update\_item”, :id =\>  
item.id },  
:html =\> { :multipart =\> :true} do |f| %\>

poi li ho aggiunti via rjs:

page \<\<  
“$(‘edit\_item\_#{@item.id}’).writeAttribute(‘action’,$(‘edit\_item\_#{@item.id}’).readAttribute(‘action’)+’.js’);”  
page \<\<  
“$(‘edit\_item\_#{@item.id}’).writeAttribute(‘target’,‘upload\_frame’);”

Magari torna utile.

Grazie per le indicazioni.

Matteo
