2009-05-07 8 views
1

私はレール上でスピードアップし、奇妙な問題に遭遇しました。私はデータベースからいくつかの画像をレンダリングしています(画像モデルは別のモデルのPlantsに添付されています)。私は部分的にそれをやろうとするときにいくつかの問題を抱えています。Rails Partial Image Rendering

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

これがレンダリングされると、それだけではなく、各画像の「#」をレンダリングする:私は

<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> 

と部分_show_image.html.erb

show.html.erb持っています実際の画像。それはちょうど私が手元のように、文字列としてオブジェクトをレンダリングしているようだ:

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

ローカルデバッガによって実行する場合:ここで

/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 

は、[ビットを切り取ら]私のモデルです。

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 

答えて

4

代わりにこれを試してみてください:

<% 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 %> 

申し訳ありませんが、フォーマットについては、あなたが考えを得る。

+0

ありがとう、それは完璧に働いた。最終的にこの構文のハングアップを取得します... =) –

+0

トリックは<%= 'render'コールの前に強制します。 –

1

自分のイメージモデルにあなたの植物で

class Image < ActiveRecord::Base 
    belongs_to :plant 
    validates_presence_of :uploaded_picture 
    ... 
end 
あなたの植物コントローラで

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 
... 

そしてをPICための方法を構築するには、表示:

<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> 

あなたがしたいことuploaded_pictureバイナリフィールドをある程度エンコード/デコードする(私はBase64.encodeとBase64.decodeをイメージに使う)contrしかし、それは別の問題です。

あなたを助ける希望

+0

ルビドメインから画像(バイナリ)データを送信することは良い考えではありません - それを行うためにコアWebサーバを委任してください - 彼らはもっと最適な仕事をするでしょう。つまり、別々の静的コンテンツWebサーバーにイメージを置くことを検討することです。 –