rails g migration add_course_cover
rake db:migrate
models/course.rb
class Course < ActiveRecord::Base
attr_accessible :name, :cid, :desc, :syllabus, :cover
belongs_to :creator, :class_name => 'User', :foreign_key => :creator_id
has_many :chapters
has_many :course_wares, :through => :chapters
validates :creator, :name, :cid, :desc, :syllabus, :presence => true
default_scope order('id desc')
max_paginates_per 50
# carrierwave
mount_uploader :cover, CourseCoverUploader
module UserMethods
def self.included(base)
base.has_many :courses, :foreign_key => 'creator_id'
end
end
end
db/migrate/add_course_cover.rb
class AddCourseCover < ActiveRecord::Migration
def change
add_column :courses, :cover, :string
end
end
uploader/course_cover_uploader,rb
class CourseCoverUploader < CarrierWave::Uploader::Base
# 存储方式 本地硬盘存储
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# 给上传的文件重新命名
def filename
if original_filename.present?
ext = file.extension.blank? ? "" : ".#{file.extension}"
"#{secure_token}#{ext}"
end
end
# 当文件不存在时的默认 url
def default_url
# For Rails 3.1+ asset pipeline compatibility:
# asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
"default_course_covers/#{version_name}.png"
end
# 允许上传的文件类型的扩展名
def extension_white_list
%w(jpg jpeg gif png)
end
# 切割图片
include CarrierWave::MiniMagick
protected
def secure_token
var = :"@#{mounted_as}_secure_token"
model.instance_variable_get(var) || model.instance_variable_set(var, randstr)
end
end
view:edit.html.haml
= simple_form_for @course do |f|
= f.input :name
= f.input :cid
= f.input :desc, as: :text
= f.input :syllabus, as: :text
- if @course.cover
= image_tag @course.cover.url
= f.input :cover, as: :file
= f.submit