Forum: Italian Ruby user group problemi con attachment_fu, ajax e responds_to_parent

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Matteo F. (Guest)
on 2009-01-05 10:40
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-...

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.
Piccini R. (Guest)
on 2009-01-05 12:00
(Received via mailing list)
On Mon, Jan 5, 2009 at 9:40 AM, Matteo F. <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)
>
> 2) 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-upl...
Matteo F. (Guest)
on 2009-01-05 12:43
Piccini R. wrote:
> On Mon, Jan 5, 2009 at 9:40 AM, Matteo F. <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)
>>
>> 2) 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-upl...

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. (Guest)
on 2009-01-05 13:31
(Received via mailing list)
2009/1/5 Matteo F. <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| -%>
  <p>
    Passo 1:
  </p>

  <%= f.error_messages :header_message => "Errore nell'inserimento
dati", :message => "Riepilogo errori: " %>

  <ul>
    <li>
      <%= f.label :uploaded_data, "file da caricare: " %><%=
f.file_field :uploaded_data %>
    </li>
  </ul>
  <%= f.submit 'carica file' %>
<% end -%>

<iframe id="upload_frame" name="upload_frame" style="display:
none"></iframe>


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.....
Matteo F. (Guest)
on 2009-01-05 14:11
Piccini R. wrote:
> 2009/1/5 Matteo F. <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| -%>
>   <p>
>     Passo 1:
>   </p>
>
>   <%= f.error_messages :header_message => "Errore nell'inserimento
> dati", :message => "Riepilogo errori: " %>
>
>   <ul>
>     <li>
>       <%= f.label :uploaded_data, "file da caricare: " %><%=
> f.file_field :uploaded_data %>
>     </li>
>   </ul>
>   <%= f.submit 'carica file' %>
> <% end -%>
>
> <iframe id="upload_frame" name="upload_frame" style="display:
> none"></iframe>
>
>

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.
Piccini R. (Guest)
on 2009-01-05 14:15
(Received via mailing list)
On Mon, Jan 5, 2009 at 1:11 PM, Matteo F. <removed_email_address@domain.invalid>
wrote:
>>> --
>>   </p>
>>   <%= 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
Matteo F. (Guest)
on 2009-01-05 14:40
Piccini R. wrote:
> On Mon, Jan 5, 2009 at 1:11 PM, Matteo F. <removed_email_address@domain.invalid>
> wrote:
>>>> --
>>>   </p>
>>>   <%= 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
Piccini R. (Guest)
on 2009-01-07 09:38
(Received via mailing list)
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>:
Matteo F. (Guest)
on 2009-02-14 13:20
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
This topic is locked and can not be replied to.