Fileuploads mit dem "form_remote_tag"... 0

Posted by fwoeck
on Friday, February 27

... klappen leider nicht: JScript darf nicht!

Was kann man tun in einer Situation, in der man viele einzelne Forms auf einer Seite unterhält, die alle von derselben Codeschleife generiert werden, von denen die meisten keine Fileuploads enthalten und via form_remote_tag angeschoben werden können, aber einige eben doch, so dass diese den konventionellen form_tag verwenden müssen?

Noch mal deutlicher – die Situation:

1
2
3
4
5
6
<% form_tag project_path(@project), :method => :put, :multipart => true do %>
  ... Code der den Forminhalt erzeugt ...
  ... wird pro Seite mehrfach durchlaufen ...
  ... Ein paar Male enthält er Fileuploads, ...
  ... ein paar Male nicht ...
<% end %>

Im form_remote_tag bleibt das :multipart => true wirkungslos. Die Frage, welcher Tag für einen Durchlauf benutzt werden soll, hängt in diesem Beispiel vom jeweiligen Inhalt ab, nämlich ob es ein Fileupload-Feld in diesem Form gibt.

Die eleganteste Lösung, die ich dafür gefunden habe ist, den Form-kopf konditional zu gestalten. Da in den neueren Railsversionen die Formtags i.d.R. einen Block mitbekommen, würden sich dadurch die Form- und die Blockgrenzen der bedingenden if-Schleife überschneiden: geht so nicht.

Also lässt man den Block weg (das do im tag), ersetzt das abschließende <% end %> durch ein </form> und vergisst nicht, den Form-Tags ein <%= zu verpassen, da sie sonst nämlich nichts mehr ausgeben wollen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<% unless actual_form.elements.include?("upload_field") %>

  <%= form_remote_tag :url => "/projects/#{@project.id}", :method => :put, \
    :loading => "Toggle.display('justsaving_#{group.id}');", :complete => \
    "Toggle.display('justsaving_#{group.id}');" %>

<% else %>

  <%= form_tag project_path(@project), :method => :put, :multipart => true %>

<% end %>
  ... Code der den Forminhalt erzeugt ...
  ... wird pro Seite mehrfach durchlaufen ...
</form>
Comments

Leave a response

Comment