分类: LINUX
2015-04-30 17:22:42
MVC
浏览器提交到控制器,控制器根据模型,模型到数据库里找到相应的处理给控制器,控制器跟View沟通,决定返回什么页面给浏览器。
在提交控制器之前,有个路由问题,
手脚架scaffold,快速自动生成blog
rubygems 包管理工具gem命令
安装Rails
gem instal rails -v 4.2.0.beta4
建立一个简单web应用
$rails _4.2.0.beta4_ new hello_app #new命令会自动生成所有文件结构,同时自动执行bundle install命令编译执行
Gemfile 是gem安装配置文件,使用bundle install 来安装
运行rails 服务
$rails server 或者rails server -b $IP -p $PORT
主要配置文件:
config/routes.rb
app/controllers/*_controller.rb
git版本控制
$ git config --global user.name "Your Name"
$ git config --global user.email your.email@example.com
$ git config --global push.default matching
$ git config --global alias.co checkout
第一次使用前设置:
git init
git add -A
git status
git log
git commit -am 'init repos'
git checkout -f #强制撤销上一次的改动
分支
git checkout -b static-pages
git branch #查询分支
合并
git checkout master #先进入主分支
git merge static-pages #合并
git branch -d static-pages #删除分支
git branch -D static-pages #即使分支的改动未合并到主干,也强制删除分支
推送网上代码仓库bitbucket,注册账号,建立仓库,复制公钥到页面,cat ~/.ssh/id_rsa.pub
$ git remote add origin git@bitbucket.org:
$ git push -u origin --all # 首次推送这个仓库
git push
部署 heroku,在公网环境
使用pg ,所有要改Gemfile
bundle install --without production #不在本地使用gem
$heroku version
heroku login
heroku keys:add
heroku create #会分配一个二级域名,立即生效
heroku rename hello-dontforgetName #改一个不容易忘记的二级域名,访问hello-dontforgetName.heroku.com
print ('a'..'z').to_a.shuffle[0..7].join #随机生成不重复的域名
heroku logs
git push heroku master # 推送代码到生产环节部署
网上免费代码仓库:github 和 bitbucket 都有免费仓库和私有仓库,但github私有仓库收费,所有用bitbucket吧,如果为了安全性
建立用户资源,用户添加、查询、更新和删除的数据模型,通过手脚架scaffold
$rails generate scaffold User name:string email:string
$bundle exec rake db:migrate #根据用户数据模型产生数据库表
Note: rake 是ruby的make命令
$bundle exec rake -T db #查看数据库的相关任务
$bundle exec rake -T
关系型数据库的CURD,create,update,read,delete 和 http请求方式POST、GET、PATCH(更新)、DELETE
建立微博资源,
$rails generate scaffold Micropost context:text user_id:integer
$bundle exec rake db:migrate
rails 控制台
$rails console
限制微博长度:
app/models/micropost.rb
class Micropost < ActiveRecord::Base
validates :content, length: { maximum: 140 }
end
rails路由添加资源:
config/routes.rb
Rails.application.routes.draw do
resources :microposts
resources :users
.
end
一个用户拥有多篇微博
app/models/user.rb
class User < ActiveRecord::Base
has_many :microposts
end
一篇微博属于一个用户
app/models/micropost.rb
class Micropost < ActiveRecord::Base
belongs_to :user
validates :content, length: { maximum: 140 }
end
更新迁移本地数据库到heroku生产环境数据库
$heroku run rake db:migrate
微博内容存在性验证
app/models/micropost.rb
class Micropost < ActiveRecord::Base
belongs_to :user
validates :content, length: { maximum: 140 },presence: true
end
在用户模型加入存在验证
app/models/user.rb
class User < ActiveRecord::Base
has_many :microposts
validates FILL_IN, presence: true
validates FILL_IN, presence: true
end
$bundle update #更新gem的版本,确保安装的和Gemfile指定的一致
生成控制器代码
$rails generate controller StaticPages home help
撤销命令
$rails destroy controller StaticPages home help
$bundle exec rake db:migrate #建立数据库模型
$bundle exec rake db:rollback #撤销数据库操作
$bundle exec rake db:migrate VERSION=0
静态页面
config/routes.rb
Rails.application.routes.draw do
get 'static_pages/home'
get 'static_pages/help'
end
TDD技术,测试驱动开发Test-Driven Development,开发应用前先写测试,写测试失败的用例,然后写应用,让测试通过
test/controllers/static_pages_controller_test.rb
require 'test_helper'
class StaticPagesControllerTest < ActionController::TestCase
test "should get home" do
get :home
assert_response :success #访问/home 是否能成功返回
assert_select "title", "Home | Ruby on Rails Tutorial Sample App" #页面标题是否是这个
end
$ bundle exec rake test
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips
test/controllers/static_pages_controller_test.rb #测试控制器
app/views/static_pages/about.html.erb #view视图页面模板
app/views/layouts/application.html.erb #静态页面布局,全局有效
动态代码:
<% provide(:title, "Home") %>
<%= stylesheet_link_tag ... %> #引进应用的样式表
<%= javascript_include_tag "application", ... %> #引入javascript文件asset pipeline
<%= csrf_meta_tags %> #避免跨站请求cross-site request forgery CSRF
app/views/layouts/application.html.erb
<%= yield %> #布局文件里的这个代码是表示把/static_pages/home里的home.html.erb转化成html