學習與開發 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 來處理。