学习与开发 Ruby on Rails 应用的过程是在本地电脑上完成的。也就是你需要在本地电脑上创建 Rails 项目,运行它,然后学习或去做真正的开发。两种方法,一是可以直接在本地电脑上安装 Rails 项目的所有工具,然后直接在本地电脑上运行 Rails 项目。另外, 我们可以使用 Docker 去 Compose 一个 Rails 项目。
在本地直接运行 Rails 项目
需求
我在 macOS 上测试了整个过程。你需要:
- 安装 Ruby
- 安装 Xcode
安装 rails
打开终端,用 Ruby 的 Gem 去安装 Rails:
gem install rails
这会安装最新的 rails。你也可以指定安装具体的 Rails 版本,像这样:
gem install rails -v 5.0.0.1
如果你遇到错误:
Building native extensions. This could take a while... ERROR: Error installing rails: ERROR: Failed to build gem native extension.
意思是不能构建本地扩展,Google 上面遇到的错误,找到网页:http://stackoverflow.com/questions/19580685/installing-rails-on-mavericks
解决的方法是执行:
xcode-select --install
上面的命令是安装了 Xcode 的 Command Line Developer Tools(开发者命令行工具)。完成以后再次执行:
gem install rails
安装过程需要一段时间,看到下面提示,说明成功的安装了 rails:
Successfully installed
创建 Rails 项目
rails new 命令可以创建新的 Rails 项目,执行:
cd ~/desktop mkdir rails-app cd rails-app rails new .
先进入到桌面上,创建一个 rails-app 目录,进入这个目录,再用 rails new 在当前目录下创建一个 Rails 项目。
启动 Rails 项目
rails server 可以启动 Rails 项目。执行:
rails server
如果遇到错误:
getaddrinfo: nodename nor servname provided, or not known (SocketError)
默认服务器的端口号是 3000,如果你的本地电脑已经使用了 3000 这个端口就会遇到上面这个错误,解决的方法是在创建服务器的时候手工的指定一下新的端口号,像这样:
rails server -p 3300 -b '0.0.0.0'
这样你可以打开地址:
http://localhost:3300
你会看到 Rails 应用的欢迎界面。
在本地用 Docker 运行 Rails 项目
这会是我最终选择的在本地运行 Rails 项目的方法。以后,我也会假设您选择的是这种方法。
需求
安装 docker for mac / docker for windows
目录结构
→ mkdir -p app services/rails/config → ls app services → touch docker-compose.yml services/rails/Dockerfile services/rails/config/Gemfile → tree . ├── app ├── docker-compose.yml └── services └── rails ├── Dockerfile └── config └── Gemfile 4 directories, 3 files
Compose
打开项目根目录下的 docker-compose.yml
,定义几个服务:
version: '2' services: rails: build: context: ./services/rails dockerfile: Dockerfile volumes: - ./app:/mnt/app ports: - "3000:3000" command: bundle exec rails s -p 3000 -b '0.0.0.0' tty: true db: image: mariadb:10.1 environment: MYSQL_ROOT_PASSWORD: "root" MYSQL_DATABASE: "app" MYSQL_USER: "app" MYSQL_PASSWORD: "123123" volumes: - db:/var/lib/mysql phpmyadmin: image: phpmyadmin/phpmyadmin ports: - "8081:80" environment: PMA_HOST: "db" PMA_USER: "root" PMA_PASSWORD: "root" volumes: db: driver: local
Gemfile
打开 services/rails/config/Gemfile
文件,输入内容:
source 'https://rubygems.org' gem 'rails', '5.0.0.1'
Dockerfile
打开 services/rails/dockerfile 文件,输入内容:
FROM ruby:2.3 MAINTAINER wanghao <wanghao@ninghao.net> RUN apt-get update && apt-get install -y nodejs \ && rm -rf /var/lib/apt/lists/* RUN gem install rails --pre --no-ri --no-rdoc RUN mkdir -p /mnt/app WORKDIR /mnt/app RUN rails new . EXPOSE 3000
启动服务
运行 Docker,然后在项目的根目录下,执行:
docker-compose up -d
创建项目
在项目的根目录下,执行命令创建一个 rails 项目:
docker-compose run rails rails new .
新的项目文件会存储在 app 目录的下面。
再次启动
新创建了项目以后,再次执行:
docker-compose up -d
然后打开浏览器,输入地址:
http://localhost:3000
你会看到下面这个欢迎界面:
执行命令
在开发 Rails 应用的时候,你需要用到很多命令行工具,我们可以进入到 rails 服务的容器里,然后去执行需要的命令。进入到 rails 服务的容器:
docker-compose exec rails bash
hello,Rails
让 Rails 说出 “hello”,可以创建一个简单的控制器与视图。
用 controller 生产器,去创建一个名字是 Welcome
的控制器,里面有一个 index
动作:
rails generate controller Welcome index
结果像这样:
Running via Spring preloader in process 54 create app/controllers/welcome_controller.rb route get 'welcome/index' invoke erb create app/views/welcome create app/views/welcome/index.html.erb invoke test_unit create test/controllers/welcome_controller_test.rb invoke helper create app/helpers/welcome_helper.rb invoke test_unit invoke assets invoke coffee create app/assets/javascripts/welcome.coffee invoke scss create app/assets/stylesheets/welcome.scss
控制器:
app/controllers/welcome_controller.rb
视图:
app/views/welcome/index.html.erb
打开 index.html.erb 这个视图,删除里面的所有内容,添加下面的东西:
<h1>hello</h1>
访问地址:
http://localhost:3000/welcome/index
你会看到 “hello” 。
设置应用的首页
编辑文件:
config/routes.rb
内容如下:
Rails.application.routes.draw do get 'welcome/index' root 'welcome#index' end
root 'welcome#index'
,意思是用 welcome
控制器的 index
动作来处理对应用首页的请求。
get 'welcome/index'
,意思是请求 welcome/index
这个地址的时候,用 welcome
控制器的 index
来处理。