目前網路上關於如何在Ruby on Rails上傳檔案的方式,最熱門的就屬paperclip。
它處理圖檔必須用到convert指令,如果是Linux系統可以用which convert這個指令查看一下,系統裡面有沒有convert指令。如果沒有的話paperclip是推薦用ImageMagick,如果你有要上傳圖檔的話,就安裝一下吧,Linux可以用rpm安裝,MacOS就直接brew install imagemagick
。
之後就使用gem安裝paperclip,gem "paperclip"
簡易使用方式
我是使用Rails 4,以下是Rails 4的場景。
產生資料庫欄位的部分它沒有實作在rails generate指令裡面,所以必須自己先產生Model, 然後再產生一個Migration,把欄位加上去之後,做rake db:migrate,例如:
# 產生 "image" Model, 以及一個欄位"title"
rails g model image title:string
打開所產生的model檔案(app/models/image.rb),為它增加一個file欄位關聯
class Image < ActiveRecord::Base
has_attached_file :file,
styles: {medium" "300x300>", thumb: "100x100>" },
default_url: "/images/:style/missing.png"
validates_attachment_content_type :file, content_type: /\Aimage\/.*\Z/
end
但是只是先設定好Model關聯而已,我們實際上資料庫Table裡面並沒有file欄位,我們利用migration為他增加資料庫的file欄位:
# 產生一個migration 準備增加file欄位
rails g migration image_add_column_file
開始修改產生的migration檔案
class ImageAddColumnFile < ActiveRecord::Migration
def self.up
add_attachment :images, :file
end
def self.down
remove_attachment :images, :file
end
end
執行rake db:migrate
這邊要注意,因為我們習慣在migration裡面,使用change函式,讓migarate自動決定up與down的做法,譬如up做add_column,那麼down就做remove_column。
但rails裡頭並沒有內建add_attachment相對是remove_attachment,所以這邊我們自己保險一點,up與down做什麼都定義清楚。
Rails_Admin
如果你有裝Rails_Admin,這時候進入後台就可以看到,已經可以上傳圖檔了。
Controller and View
先用Rails_Admin隨便加幾個圖片之後,接下來我們弄個Controller來玩玩
rails g controller images
路徑設定,就直接用直接RESTful
resources :images
打開images_controller.rb,先弄個index來試試
class ImagesController < ApplicationController
def index
@image = Image.first
end
end
直接取出第一筆資料 在images/index.html.erb裡面顯示看看
<%= image_tag @image.file.url %>
<%= image_tag @image.file.url(:medium) %>
<%= image_tag @image.file.url(:thumb) %>
效果:
上傳圖片,讀出圖片都沒問題,其他就是Rails基本功的問題囉。至於paperclip其他部分,有研究在繼續Update本篇文章下面
沒有留言:
張貼留言