Problemi con attachment_fu, ajax e responds_to_parent

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

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.

On Mon, Jan 5, 2009 at 9:40 AM, Matteo F. [email protected]
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:

Piccini R. wrote:

On Mon, Jan 5, 2009 at 9:40 AM, Matteo F. [email protected]
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/

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

Piccini R. wrote:

2009/1/5 Matteo F. [email protected]:

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.

2009/1/5 Matteo F. [email protected]:

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…

On Mon, Jan 5, 2009 at 1:11 PM, Matteo F. [email protected]
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

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. [email protected]:

Piccini R. wrote:

On Mon, Jan 5, 2009 at 1:11 PM, Matteo F. [email protected]
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

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