学习与开发 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 应用的欢迎界面。
48AA8CB6-CEDC-40B8-B2AE-B9BD7FBEDF2D
在本地用 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
你会看到下面这个欢迎界面:
7917D846-21E0-4A4E-B784-A886334C4582
执行命令
在开发 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 来处理。