2009-05-07 10 views
1

Je me lève sur les rails et je rencontre un problème étrange. Je rends des images de la base de données (modèles d'images attachés à un autre modèle, Plantes). J'ai quelques problèmes en essayant de le faire via un partiel. J'ai show.html.erbRails Rendu partiel de l'image

<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 la _show_image.html.erb partielle:

<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 rend juste un "#" pour chaque image, plutôt que la image réelle. Il semble juste de rendre l'objet en tant que chaîne, comme dans la source que je reçois:

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

Lors de l'exécution par le débogueur localement:

/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 [Snipped 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 

Répondre

4

Essayez 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 avez l'idée.

+0

Merci, cela a fonctionné parfaitement. Je vais finir par avoir cette syntaxe ... =) –

+0

l'astuce consiste à forcer <% = devant l'appel 'render'. –

1

construire une méthode pour l'image dans votre modèle d'image

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

Dans votre contrôleur plantes

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 puis dans vos plantes Vue:

<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 pouvez encoder/décoder le champ binaire upload_picture quelque part (j'utilise Base64.encode et Base64.decode) dans vos contr oller, mais c'est un autre problème.

L'espoir qui vous aide

+0

envoyer des données image (binaire) de domaine ruby ​​n'est pas une bonne idée - déléguer le serveur Web de base pour le faire - ils feront beaucoup plus de travail optimal. Je veux dire, l'envisager de mettre des images sur un serveur web séparé, statiques-contenu. –

Questions connexes