课程目标
这一课商店网站,你将会学到至少以下的主题:
- 购物车设计
- 结帐订单
- 第三方整合
- 代码重构
熟练掌握这个课程的主题后,能够让你在未来写出绝大多数的网站功能。
技术议题包含:
- Model 设计原则
- 自定义 before_action
- 自定义 Routing
- validation
- session 操作
- find_by 操作
- where / order
- 巢状表单
- State Machine
- ActiveJob
- Mailer
- Partial / Helper
课程复盘
1. 找出系统核心组件与角色
Must Have / Should Have / Could Have / Nice to Have
当书写过一轮功能之后,会发现最后留下的 Must Have / Should Have 中,最核心的功能应该会剩下以下几部分:
- 购买机制 - 消费者购买商品,放入购物车
- 结帐机制 - 消费者将购物车中的商品,结帐生成订单
- 上架机制 - 商家上架物品,设定开卖
- 配送机制 - 商家针对订单配送
整个系统有两个核心角色:
2. User Story
商家
身为商家(管理者),我要能够在后台上架我的商品,并设定能够贩卖
- 身为商家,我要能够登入后台
- 整个商店网站分为两种权限:admin (商家=管理者) / user (消费者)
- 商家可以登入 /admin 后台
- 身为商家,我要能够登入后台上架商品
- 后台上架网址必须要是 /admin/products
- 商品的内容分为商品名称、描述、价格、库存
- 商品要能够设定是否能上架贩卖
- 商品必须要有商品图片
消费者
订单部分
3. 常用网站基础建设
Part 1: 安装 Bootstrap
Step 1. 挂上 bootstrap-sass 这个 gem
Gemfile1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| gem 'bootstrap-sass' `` Step 2. bundle install 执行 `bundle install` Step 3. 将 Bootstrap 的 CSS 套件装进专案里面 在终端输入 `mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss` 然后修改 `app/assets/stylesheets/application.scss` 档案,在最后加入以下两行 ```ruby app/assets/stylesheets/application.scss /* * ...(一堆注解) *= require_tree . *= require_self */
+ @import "bootstrap-sprockets"; + @import "bootstrap";
|
Step 4. 将变更 commit 进 git 里面
1 2
| git add . git commit -m "add bootstrap to project"
|
Part 2:修改样式
Step 1. 新增 app/views/common 资料夹
mkdir app/views/common
Step 2. 新增 navbar
touch app/views/common/_navbar.html.erb
填入
app/views/common/_navbar.html.erb1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <nav class="navbar navbar-default" role="navigation"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <a class="navbar-brand" href="/">JDStore </a> </div>
<!-- Collect the nav links, forms, and other content for toggling --> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav navbar-right"> <li><%= link_to("登入", '#') %></li> </ul> </div> <!-- /.navbar-collapse --> </div> <!-- /.container-fluid --> </nav>
|
Step 3. 新增 footer
touch app/views/common/_footer.html.erb
填入
app/views/common/_footer.html.erb1 2 3 4 5 6
| <footer class="container" style="margin-top: 100px;"> <p class="text-center">Copyright ©2017 JDStore <br>Design by yourname </p> </footer>
|
Step 4. 修改全域 HTML 样式 application.html.erb
app/views/layouts/application.html.erb1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <!DOCTYPE html> <html> <head> <title>JDStore </title> <%= csrf_meta_tags %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> </head> <body> <div class="container-fluid"> <%= render "common/navbar" %> <%= yield %> </div>
<%= render "common/footer" %>
</body> </html>
|
Step 5. 产生一个新的空 Hello World 页面 (放在 welcome#index)
执行
rails g controller welcome
新增一个 welcome controllertouch app/views/welcome/index.html.erb
新增一个空的 HelloWorld 页面
填入
Step 6. 将首页指到 welcome 下的 index.html.erb 页面
修改config/routes.rb
,改成以下内容
config/routes.rb1 2 3
| Rails.application.routes.draw do root 'welcome#index' end
|
Step 7. git 进度存档
1 2
| git add . git commit -m "add bootstrap html"
|
Step 8. 重开 Rails Server
Part 3:增加 flash 功能
Step 1. 将 Boostrap 的 js 提示套件 bootstrap/alert “挂”进专案里面
在 requre_tree
上加入一行 //= require bootstrap/alert
Step 2. 新增 app/views/common/_flashes.html.erb
touch app/views/common/_flashes.html.erb
填入
app/views/common/_flashes.html.erb1 2 3 4 5 6 7 8
| <% if flash.any? %> <% user_facing_flashes.each do |key, value| %> <div class="alert alert-dismissable alert-<%= flash_class(key) %>"> <button class="close" data-dismiss="alert">×</button> <%= value %> </div> <% end %> <% end %>
|
Step 3. 加入 app/helpers/flashes_helper.rb
touch app/helpers/flashes_helper.rb
填入以下内容:
app/helpers/flashes_helper.rb1 2 3 4 5 6 7 8 9 10 11
| module FlashesHelper FLASH_CLASSES = { alert: "danger", notice: "success", warning: "warning"}.freeze def flash_class(key) FLASH_CLASSES.fetch key.to_sym, key end def user_facing_flashes flash.to_hash.slice "alert", "notice","warning" end end
|
Step 4. 在 application.html.erb 内加入 flash 这个 partial
在 <%= yield %>
前加入 <%= render "common/flashes" %>
app/views/layouts/application.html.erb1 2
| <%= render "common/flashes" %> <%= yield %>
|
Step 5. git 存档
1 2
| git add . git commit -m "add bootstrap flash function"
|
Step 6: 测试 flash helper 的功能
加入 flash[:notice] = "早安!你好!"
。你应该可以看到系统跳出“绿色”提示窗。
app/controllers/welcome_controller.rb1 2 3 4 5
| class WelcomeController < ApplicationController def index flash[:notice] = "早安!你好!" end end
|
Part 4:安装 Devise
Step 1: 安装登入系统
Devise 是一个 Rails 内热门的 gem,专门用来快速实作“登入系统”。在这一节我们会用 devise 实作登入功能。
Gemfile 新增一行 gem 'devise'
然后执行bundle install
Step 2 : 产生会员系统的必要档案
执行
1 2 3
| rails g devise:install rails g devise user rake db:migrate
|
重启rails s
Step 3: 修改 app/views/common/_navbar.html.erb
app/views/common/_navbar.html.erb1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| - <li> <%= link_to("登入", '#') %> </li> + <% if !current_user %> + <li><%= link_to("注册", new_user_registration_path) %> </li> + <li><%= link_to("登入", new_user_session_path) %></li> + <% else %> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + Hi!, <%= current_user.email %> + <b class="caret"></b> + </a> + <ul class="dropdown-menu"> + <li> <%= link_to("登出", destroy_user_session_path, method: :delete) %> </li> + </ul> + </li> + <% end %>
|
Step 4: 修改 app/assets/javascripts/application.js
加入一行//= require bootstrap/dropdown
app/assets/javascripts/application.js1 2
| //= require bootstrap/alert + //= require bootstrap/dropdown
|
成果应该会是这样的效果。
Step 5: git 储存
1 2
| git add . git commit -m "user can login/logout/signup"
|
Step 1. 使用 SimpleForm 简化
首先我们要来安装 simple_form
打开 Gemfile,然后新增一行 gem 'simple_form'
Gemfile1 2 3
| gem 'bootstrap-sass' gem 'devise' + gem 'simple_form'
|
然后执行bundle install
,安装 gem。
Step 2. 安装 simple_form for bootstrap 的设定
执行:rails generate simple_form:install --bootstrap
然后重开 rails server
( ctrl+c
然后 rails s
)
Step 3. git 存档
1 2
| git add . git commit -m "install simpleform with bootstrap"
|
Part 6: 安装 font-awesome-rails
Step 1. 挂上font-awesome-rails
Gemfile1 2 3
| gem 'devise' gem 'simple_form' + gem 'font-awesome-rails'
|
Step 2. bundle install
执行 bundle install
重启rails s
Step 3. 将 font-awesome装进专案里面
Step 4. 修改 app/views/common/_navbar.html.erb
app/views/common/_navbar.html.erb1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <% if !current_user %> <li><%= link_to("注册", new_user_registration_path) %> </li> - <li><%= link_to("登入", new_user_session_path) %></li> + <li><%= link_to(content_tag(:i, '登入', class: 'fa fa-sign-in'), new_user_session_path) %></li> <% else %> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Hi!, <%= current_user.email %> <b class="caret"></b> </a> <ul class="dropdown-menu"> - <li> <%= link_to("登出", destroy_user_session_path, method: :delete) %> </li> + <li> <%= link_to(content_tag(:i, '登出', class: 'fa fa-sign-out'), destroy_user_session_path, method: :delete) %> </li> </ul> </li> <% end %>
|
登入、登出旁会出现新图标
Step 5. git存档
1 2
| git add . git commit -m "install font-awesome-rails"
|
Part 7: 安装debug套件
打开Gemfile
Gemfile1 2 3 4 5 6 7
| group :development, :test do gem 'byebug', platform: :mri gem 'sqlite3' + gem 'pry' + gem 'awesome_rails_console' end
|
执行
1 2 3 4
| bundle install rails g awesome_rails_console:install git add . git commit -m "install pry and awesome_rails_console"
|
Part 8: 安装展示model关系的gem套件
安装 Graphviz 2.22+:
终端机中执行
安装gem rails-erd
ruby Gemfile1 2 3 4
| gem 'qiniu-rs' gem 'figaro' + gem 'rails-erd' group :development, :test do
|
执行
1 2 3
| bundle install git add . git commit -m "install graphviz and rails-erd"
|
使用说明:
- 终端机中执行 rake erd 可生成erd文件
- GEM自动生成的PDF格式文件,在ATOM中无法正常打开,显示一堆乱码。
- 在ATOM中找到新建的 erd.pdf ,右击找到 Show in Finder点击进入文件夹找到该文件,打开即可看到目前的model之间的关系。