创建一个新项目,设置mysql数据库
rails new demo -d mysql cd demo rake db:create
用脚手架工具创建表单及数据库
rails generate scaffold Person name:string secret:string country:string email:string description:text can_send_email:boolean graduation_year:integer body_temperature:float price:decimal birthday:date favorite_time:time rake db:migrate rails server -d
编辑app/model/person.rb代码如下,实现表单验证功能
class Person < ActiveRecord::Base
attr_accessible :birthday, :body_temperature, :can_send_email, :country, :description, :email, :favorite_time, :graduation_year, :name, :price, :secret
#表单内容必须填写
validates_presence_of :name, :message => "姓名必须填写"
validates_presence_of :graduation_year, :message => "毕业年份必须填写"
validates_presence_of :description, :message => "写一点自我介绍吧"
#表单信息长度设置
validates_length_of :secret, :in => 6..12, :message => "密码长度必须是6~12之间"
#表单内容格式验证
validates_format_of :secret, :with => /[0-9]/, :message => "密码至少需要包含数字,大写字母及小写字母"
validates_format_of :secret, :with => /[A-Z]/, :message => "密码至少需要包含数字,大写字母及小写字母"
validates_format_of :secret, :with => /[a-z]/, :message => "密码至少需要包含数字,大写字母及小写字母"
#表单范围验证
validates_inclusion_of :country, :in => ['Canada', 'Mexico', 'UK', 'USA'], :message => "国家在'Canada','Mexico','UK','USA'中选择"
#邮箱格式验证
validates_presence_of :email, :if => :require_email_presence?
validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :if => :require_email_presence?, :message => "邮箱格式不>正确"
#数据唯一性保证
validates_uniqueness_of :email, :case_sensitive => false, :message => "邮箱已被占用"
#多个数据规则验证
validates_numericality_of :graduation_year, :allow_nil => true, :greater_than => 1920, :less_than_or_equal_to => Time.now.year, :only_integer => true, :message => "毕业年份不正确"
#日期范围验证
validates_inclusion_of :birthday, :in => Date.civil(1900, 1, 1) .. Date.today, :message => "日期必须是1900年1月1日到今天之间"
#自定义验证
validate :description_length_words
#条件验证
def require_email_presence?
self.can_send_email
end
#自定义验证
def description_length_words
# only do this validation if description is provided
unless self.description.blank? then
# simple way of calculating words: split the text on whitespace
num_words = self.description.split.length
if num_words < 5 then
self.errors.add(:description, "介绍必须是5个英文词以上")
elsif num_words > 50 then
self.errors.add(:description, "介绍控制在50个词以下")
end
end
end
end
可以通过访问http://127.0.0.1:3000/people检测效果,上面是在测试环境运行
#编辑 config/environments/production.rb 文件,配置如下 config.serve_static_assets = true config.assets.compile = true
执行rails server -e production运行在生产环境下,使用生产环境的数据库
接着添加文件上传功能,首先需要为数据表增加头像字段
rails generate migration add_photo_extension_to_person
class AddPhotoExtensionToPerson < ActiveRecord::Migration
def change
add_column :people, :extension, :string
end
end
rake db:migrate RAILS_ENV="production"修改数据表
修改model如下
class Person < ActiveRecord::Base
attr_accessible :birthday, :body_temperature, :can_send_email, :country, :description, :email, :favorite_time, :graduation_year, :name, :price, :secret, :photo
after_save :store_photo
def photo=(file_data)
unless file_data.blank?
@file_data = file_data
self.extension = file_data.original_filename.split('.').last.downcase
end
end
def has_photo?
File.exists? photo_filename
end
PHOTO_STORE = File.join Rails.root, 'public', 'photo_store'
def photo_filename
File.join PHOTO_STORE, "#{id}.#{extension}"
end
def photo_path
"/photo_store/#{id}.#{extension}"
end
private
# 数据库操作完毕后将文件存入文件系统
def store_photo
if @file_data
# 创建文件夹
FileUtils.mkdir_p PHOTO_STORE
# write out the image data to the file
File.open(photo_filename, 'wb') do |f|
f.write(@file_data.read)
end
# ??
@file_data = nil
end
end
end
增加_form.html.erb文件添加如下内容
#修改
<%= form_for(@person, :html => { :multipart => true }) do |f| %>
#添加
<div class="field">
<%= f.label :photo %><br />
<%= f.file_field :photo %>
</div>
添加show.html.erb文件如下
<p>
<b>Photo:</b>
<% if @person.has_photo? %>
<%= image_tag @person.photo_path %>
<% else %>
No photo.
<% end %>
</p>