Question

Je me suis mis au courant sur les rails et j'ai rencontré un problème étrange. Je suis en train de rendre certaines images de la base de données (modèles d'image associés à un autre modèle, Plants). J'ai des problèmes en essayant de le faire via un partiel. J'ai show.html.erb

 <fieldset class="fieldset">
      <legend>Images</legend>
      <%=  unless @plant.images.blank? then
                for image in @plant.images
                     debugger 
                     render :partial => 'show_image', :object => image 
                end
           else
                "This plant has no images to display."
           end
      %>
 </fieldset>

Et le partiel _show_image.html.erb:

 <div class="image_container">
      <% debugger %>
      <img src="<%= url_for(:action => 'picture', :id => object.id) %>"/> 
      <p class='image_caption'><%= object.comment %></p> 
 </div>

Lorsque cela est rendu, il ne fait que restituer un " # " pour chaque image, plutôt que l'image réelle. Il semble ne faire que restituer l'objet sous forme de chaîne, comme dans le source, je reçois:

 <fieldset class="fieldset">
      <legend>Images</legend>
      #<Image:0x242c910>
 </fieldset>

Lors de l'exécution locale du débogueur:

 /Users/*****/dev/plantmanager/app/views/plants/show.html.erb:54
 debugger
 (rdb:241) image
 #<Image id: 40, comment: "Test", name: "Ixia.gif", content_type: "image/gif", data: "GIF89a2\0002\000####$\205\233\tI\250\"x\224\b?\206\031d|ju####\v\031###\247\bI\257G\222\232\222\227\263\262...", plant_id: 55, thumbnail: nil> 
 (rdb:221) @plant
 #<Plant id: 55, name: "Test", description: "Test", created_at: "2009-05-07 07:19:44", updated_at: "2009-05-07 07:19:44", planted: "2009-05-07 00:00:00", sprouted: "2009-05-15 00:00:00", plant_type_id: 1, finished: "2009-05-27 00:00:00">
 (rdb:221) @plant.images
 [#<Image id: 40, comment: "Test", name: "Ixia.gif", content_type: "image/gif", data: "GIF89a2\0002\000####$\205\233\tI\250\"x\224\b?\206\031d|ju####\v\031###\247\bI\257G\222\232\222\227\263\262...", plant_id: 55, thumbnail: nil>]
 (rdb:221) continue
 /Users/*****/dev/plantmanager/app/views/plants/_show_image.html.erb:2
 <% debugger %>
 (rdb:221) object
 #<Image id: 40, comment: "Test", name: "Ixia.gif", content_type: "image/gif", data: "GIF89a2\0002\000####$\205\233\tI\250\"x\224\b?\206\031d|ju####\v\031###\247\bI\257G\222\232\222\227\263\262...", plant_id: 55, thumbnail: nil>
 (rdb:221) object.id
 40
 (rdb:221) object.comment
 "Test"
 (rdb:221) continue

Voici mes modèles [coupés un peu]:

class Plant < ActiveRecord::Base
     has_many :images

     validates_presence_of :name
     validates_presence_of :plant_type_id
     validates_associated :images


     after_update :save_images

     def image_attributes=(image_attributes)
          image_attributes.each do |attributes|
               # TODO: Probably handle validation in the image model?
               if attributes[:id].blank?
                   unless attributes[:uploaded_picture].blank?
                        tmpImg = images.build()
                        tmpImg.uploaded_picture=attributes[:uploaded_picture]
                        tmpImg.comment = attributes[:comment] 
                   end
               else
                   img = images.detect { |i| i.id == attributes[:id].to_i }
                   img.attributes = attributes
                end
           end
      end


      def save_images
           images.each do |i|
                if i.should_destroy?
                     i.destroy
                else
                     i.save(false)
                end
           end 
      end
 end

 class Image < ActiveRecord::Base 
      validates_format_of :content_type, 
                          :with => /^image/, 
                          :message => "--- you can only upload pictures" 

      attr_accessor :should_destroy

      def should_destroy?
           should_destroy.to_i == 1
      end

      def uploaded_picture=(picture_field)
           self.name = base_part_of(picture_field.original_filename) 
           self.content_type = picture_field.content_type.chomp 
           self.data = picture_field.read
           #image = MiniMagick::Image.from_blob self.data
           #self.thumbnail = resize_and_crop(image, 100).to_blob
      end 

      def base_part_of(file_name) 
           File.basename(file_name).gsub(/[^\w._-]/, '') 
      end
 end 
Était-ce utile?

La solution

Essayez plutôt ceci:

<%  unless @plant.images.blank?
                for image in @plant.images
%>
                     <%= render :partial => 'show_image', :object => image %>
                <% end
           else %>
                This plant has no images to display.
           <% end %>

Désolé pour le formatage, mais vous voyez l'idée.

Autres conseils

Créez une méthode pour la photo dans votre modèle d'image

class Image < ActiveRecord::Base
   belongs_to :plant
   validates_presence_of :uploaded_picture
   ...
end

Dans votre contrôleur d'installations

def plant_pic
  img = Image.find(params[:id])      
  # THE NEXT LINE IS THE ONE I THINK YOU ARE MISSING:
  send_data img.uploaded_picture, :filename =>"plant#{img.plant_id}_#{img.id.to_s}+'.jpg', 
                                  :type => 'image/jpeg', 
                                  :disposition => 'inline'
end
...

Et ensuite, dans votre vue Plantes:

<fieldset class="fieldset">
  <legend>Images</legend>
  <% if plant.images.blank? -%>
  <p>This plant has no images to display.</p>
  <% else %>
    <%= @plant.images.each do |image| %>
      <div class="img_container"> 
      <img src="<%= url_for(:action => 'plant_pic', :id => image.id) %>"/>
      </div>
    <% end -%>
  <% end -%>
</fieldset>

Vous voudrez peut-être encoder / décoder le champ binaire upload_picture (j'utilise Base64.encode et Base64.decode) dans votre contrôleur d'images, mais c'est un autre problème.

J'espère que cela vous aide

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top