Blog

Rails multiple data uploader (Part II)

Rails multiple data uploader (Part II)

Dies ist die Fortsetzung von Rails multiple data uploader (Part I)

7. Views generieren

 

Nun müssen noch Views für Category und Page generiert werden. Upload benötigt keine extra Views.

categories views

Hier habe ich ganz normale Views mit einem Form-Partial verwendet. Diese sind ganz normal standardmäßig gestaltet. Einzig in die show.html.erb rendere ich ein partial page:

<%= render :partial => 'pages/page', :collection => @category.pages %>

pages views

new.html.erb

<div id="new_page">
  <h1>Neue Seite</h1>
   <% form_for @page, :html => { :multipart => true } do |f| %>
   <%= render :partial => 'form', :locals => {:f => f} %>
     <p><%= f.submit "Create" %></p>
     <%= textile_editor_initialize -%>
   <% end %>

   <%= link_to 'Zurück zum Überblick', pages_path %>
</div>

Hier ist besonders wichtig die HTML-Option :html => { :multipart => true } auf multipart => true zu setzen. Ohne dies können keine binären Dateien verwendet werden und diese werden ja beim Upload hergenommen.

<%= textile_editor_initialize -%>

wird nur benötigt, falls das acts_as_textiled im Model von page.rb gesetzt wurde

edit.html.erb

<div id="edit_page">
  <h1>Seite ändern</h1>
    <% form_for @page, :html => { :multipart => true } do |f| %>
      <%= render :partial => 'form', :locals => {:f => f} %>
     <p><%= f.submit "Update" %></p>
     <%= textile_editor_initialize -%>
    <% end %>

    <%= link_to 'Seite anzeigen', @page %> |
    <%= link_to 'Zurück', pages_path %>
</div>

Gleiches beachten wie bei new.html.erb

_form.html.erb

<%= f.error_messages %> 
<p>
  <%= f.label :category_id %><br />
  <%= f.select (:category_id, @choice.map {|u| [u.name,u.id]}) %>
</p>
<p>
  <%= f.label 'Titel:' %><br />
  <%= f.text_field :title %>
</p>
<p>
  <%= f.label 'Content:' %><br />
  <%= textile_editor 'page', 'body' %>
</p>
 
<% @page.uploads.each do | upload | %>
    <%= image_tag(upload.data.url(:thumb), :alt => '') %>
<% end %>
 
<% f.fields_for :uploads do |updater| %>
  <% unless updater.object.new_record? %>
    <%= updater.check_box '_delete' %>
    <%= updater.label '_delete', 'Bild entfernen' %>
  <% end %>
<% end %>
 
<p>Bilder zu dieser Seite hinzufügen</p>
<% f.fields_for :uploads do |builder| %>
  <% if builder.object.new_record? %>
    <p>
    <%= builder.label :data_file_name, "Dateiname" %>
    <%= builder.text_field :data_file_name %>
   </p>
   <p>
     <%= builder.label :data, "Upload File"%>
     <%= builder.file_field :data %>
   </p>
  <% end %>
<% end %>

Dieses Partial rendert das Form-Partial. Bitte die entsprechenden Spezialteile für das anzeigen, hinzufügen, ändern von Dateien beachten.

<%= f.label :category_id %><br />
<%= f.select (:category_id, @choice.map {|u| [u.name,u.id]}) %>

@choice.map wird benötigt um die Auswahl aller Categories beim erstellen einer neuen Page darstellen und anschließend auswählen zu können. Ich habe dafür im applications_controller.rb folgende Methode geschrieben:

def get_categories
  @choice = Category.all
end

Diese muss somit noch zum applications_controller.rb hinzugefügt werden.

_page.html.erb

<div id="show_page">
  <div class="category_page">
    <div class="page_title">
      <%=h page.title %>
    </div>
    <div class="page_body">
      <%= page.body %>
    </div>
    <% for upload in page.uploads %>
      <%= image_tag upload.data.url(:large), :alt => "" %>
    <% end %>
  </div>
</div>

Dieses Partial rendert eine einzelne Seite später dann zu einer entsprechenden Category dazu.

So nun sind wir am Ende dieses kleinen Tutorials angekommen. Ich hoffe es war euch nicht zu lange. Ich stehe für Fragen, Anregungen, Bemerkungen jederzeit gerne zur Verfügung, einfach einen kurzen Kommentar hinterlassen.

Dieser multiple-data-uploader kann nun natürlich noch für weitere Models hergenommen werden und einfach dafür um 1:n Beziehungen erweitert werden.

 

25.05.2010
Matthias Frick
Ruby on Rails
1 Kommentar

Über den Autor

Matthias Frick
Matthias Frick, MSc.

Er ist ein langjähriger Ruby-on-Rails Entwickler und leitet das Unternehmen Frick-Web.

1 Kommentar zu "Rails multiple data uploader (Part II)"

  1. Pete Blackwood
    Pete Blackwood 27.03.2012
    Very useful tutorial. My favourite gem for image processing in rails is carrierwave, it is similar to paperclip, but you have more flexibility to customize the behavior. But anyway, thanks for sharing!

Kommentar verfassen