2009-12-07 198 views
36

我是新來的鐵軌,所以很抱歉,如果這很容易。我想知道上傳圖片並將其顯示在Ruby on Rails中的最佳方式。我有一個博客,並希望在創建帖子時可以選擇添加圖片。上傳圖片Ruby on Rails

回答

3

很多人推薦PaperClip。也許你想先嚐試一下。

7

假設你不需要花哨的功能,不希望添加的依賴,並希望將圖像存儲爲你的數據庫BLOB的,你可以這樣做:

型號:

class Image < ActiveRecord::Base 
    def img=(input_data) 
    self.filename = input_data.original_filename 
    self.filetype = input_data.content_type.chomp 
    self.img = input_data.read 
    end 
end 

控制器:

class ImagesController < ApplicationController 
    def display_img 
    @img = Image.find(params[:id]) 
    send_data(@img.img, :type => @img.filetype, :filename => @img.filename, 
       :disposition => 'inline') 
    end 
end 

Here's a link一個更完整的教程。

+4

避免在數據庫中存儲大量的斑點 - 很少有這樣的情況,這是一個好主意。 – bensie

2

attachment_fu(http://github.com/technoweenie/attachment_fu)是另一種選擇,雖然我個人會推薦paperclip。它不需要Rmagick這是一個很大的優勢,它支持一些很酷的功能,例如通過較小的配置上傳到S3。

4

很多人推薦使用Carrierwave,我不是例外,但我想指出一件事。在許多使用RoR編寫的站點上(顯然,不僅僅是RoR問題),我注意到發送圖片的請求可能會等待2-3秒,而且通常甚至更多,這將綁定應用程序實例(這可能並不可怕如果你使用線程或不關心性能,但它絕對是如果你使用獨角獸)。所以,我將解釋如何避免使用carrierwave:

1)挑選一些背景工人爲您的應用程序(我一般用Sidekiq去)

2)添加carrierwave_backgrounder到你的Gemfile並配置它一起工作的背景工人和carrierwave(其自述一切)

我平時都在我的控制目錄,所以我用的carrierwave_backgrounder處理並存儲在文件系統或S3或圖片store_in_background選項無論你使用

3)現在,當喲ü更新圖片,其處理和存儲轉到背景,這會釋放您的應用程序實例,但需要一段時間,大多數情況下需要超過1秒鐘,並且您需要向用戶返回一些響應

4)最簡單爲用戶提供一些響應的方式是返回JavaScript,其中您將舊圖片更改爲帶有微調框或類似物的gif,並設置javascript SetInterval函數,用於檢查圖片是否已處理(carrierwave_background提供了可以更改處理完成後,將模型的布爾列設置爲true)每2秒發送一次AJAX請求或您喜歡的任何內容,並在處理完成後更改圖片。

現在你有一個解開的應用程序實例和一個良好的用戶體驗在同一時間。

PS我是新來的導軌和web開發本身所以這個指南可能有一些注意事項,我已經錯過

希望這會幫助別人。

哦,順便說一句,這是一個叫做refile的新寶石,它很棒,在某些情況下可以是一個非常好的選擇。