2014年2月7日 星期五

Rails, 上傳圖片或其他檔案

目前網路上關於如何在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本篇文章下面

沒有留言:

張貼留言