[Ruby入門 Rails5編] 02. Railsアプリケーションの概要


前回は、とりあえず環境を構築して、アプリケーションのデフォルト画面を表示するところまで試した。
今回は、あらためてアプリケーションを作成し、Railsアプリの全体像をざっくり掴むところまでいければと思う。

※ ここからは [Ruby on Rails チュートリアル](https://railstutorial.jp/?version=5.0) に沿って進めつつ、書籍やWEBの情報で補足するスタイルでしばらく進めてみる

### 【0】 前提
---

前回の記事 で構築した環境を前提にしています。

+ Docker for Mac のCentOS7コンテナ上で環境を構築している
+ rbenv で Ruby をインストールしている
+ Gem の管理には bundler を利用している
+ コンテナ側(CentOS)とホスト側(Mac)で、作業用フォルダを共有している
+ Mac側のブラウザから、コンテナのRubyアプリを参照可能

上記と違う環境で作業する人は、適宜読み替えて解釈してください。

　
### 【１】 bundler で Rails をグローバルにインストール
---

前回は試しに特定のアプリケーションのフォルダにRailsをインストールした。
ここで、あらためてグローバルにRailsをインストールする。

```bash
mkdir ~/install
cd ~/install
bundle init

↓
vi Gemfile
   #「gem "rails"」を有効化（#をはずす）

↓
bundle install
```

　
### 【２】rbenv rehash コマンドで、railsコマンドを使えるようにする
---

「rbenv rehash」を実行することで、インストール済みのGemのコマンドが ~/.rbenv/shims に設置されて、実行できるようになる。

```bash
$ ls ~/.rbenv/shims/
bundle  bundler  erb  gem  irb  rake  rdoc  ri  ruby

$ rbenv rehash

$ ls ~/.rbenv/shims/
bundle  bundler  erb  gem  irb  nokogiri  rackup  rails  rake  rdoc  ri  ruby  sprockets  thor

# ↑いろいろ追加された！
```

　
### 【３】rails コマンドによるアプリケーションの作成
---

前回の記事では「bundle exec rails new .」でRailsアプリケーションを作ったが、今回は、railsコマンドで作ってみる（Ruby on Rails チュートリアル がそうなっているので、とりあえず合わせてみる）

```bash
# Macと共有しているフォルダに移動
cd /docker-host/share/webapps/

# Railsのバージョンを指定して、「hello_app」というアプリをnewする
rails _5.1.1_ new hello_app
```

↑ Gemfile でRailsのバージョンを指定せずにインストールしたので、最新版がインストールされている。
なので、上記は作業時点での最新版である「_5.1.1_」を指定しているが、作業タイミングによってはもっと新しいバージョンがインストールされているかもしれないので、適宜バージョンを確認してから作業する。

```bash
$ rails --version
Rails 5.1.1
```

　
### 【４】Railsアプリケーションのフォルダ・ファイル構成を大まかに見てみる
---

PHPとかで最近のフレームワークを触っている人なら、あんまり違和感のない構造だと思う。
てか、あれらがRailsを参考にしている部分も多いのかな　(｡ ・ω・))ﾌﾑﾌﾑ

とりあえずざっと眺めて、ここでは深追いせずに先に進む。

```bash
$ tree hello_app/ -L 2
hello_app/
       |-- Gemfile
       |-- Gemfile.lock
       |-- README.md
       |-- Rakefile
       |-- app
       |   |-- assets
       |   |-- channels
       |   |-- controllers
       |   |-- helpers
       |   |-- jobs
       |   |-- mailers
       |   |-- models
       |   `-- views
       |-- bin
       |   |-- bundle
       |   |-- rails
       |   |-- rake
       |   |-- setup
       |   |-- spring
       |   |-- update
       |   `-- yarn
       |-- config
       |   |-- application.rb
       |   |-- boot.rb
       |   |-- cable.yml
       |   |-- database.yml
       |   |-- environment.rb
       |   |-- environments
       |   |-- initializers
       |   |-- locales
       |   |-- puma.rb
       |   |-- routes.rb
       |   |-- secrets.yml
       |   `-- spring.rb
       |-- config.ru
       |-- db
       |   `-- seeds.rb
       |-- lib
       |   |-- assets
       |   `-- tasks
       |-- log
       |-- package.json
       |-- public
       |   |-- 404.html
       |   |-- 422.html
       |   |-- 500.html
       |   |-- apple-touch-icon-precomposed.png
       |   |-- apple-touch-icon.png
       |   |-- favicon.ico
       |   `-- robots.txt
       |-- test
       |   |-- application_system_test_case.rb
       |   |-- controllers
       |   |-- fixtures
       |   |-- helpers
       |   |-- integration
       |   |-- mailers
       |   |-- models
       |   |-- system
       |   `-- test_helper.rb
       |-- tmp
       |   `-- cache
       `-- vendor
```

　
### 【５】Gemのバージョンを固定する？
---

ここで、チュートリアルでは、プロジェクトのGemfileを編集して、各Gemのバージョンを固定しておくように指示がある。
たしかに bundle install したときに意図しないGemまで更新されて、思わぬ不具合が出るかもしれないので、上げるときは個別に指定して意図して上げるほうが良いのかもしれない。（チュートリアルでは、説明の統一のためにやっている面もあるだろうが）

※実際は、出たばかりのGemは頻繁に更新されて不具合や脆弱性が解消されたりするかもしれないので、一概には言えないだろう。

やるとすれば「bundle list」とかで今はいっているGemのバージョンを確認して、Gemfileに明示することになると思うが、たいへんなので今回はそのまま進める。

　
#### [補足] Gemfile で gem のバージョンを指定する方法

前回も書いたが、Gemfileにおけるバージョン指定方法を整理しておく

```
# 最新版をインストール
gem "rails"

# バージョン決め打ち
gem "rails", "5.1.0"

# あるバージョン`以上`の最新版をインストール
gem 'uglifier', '>= 1.3.0'

# 指定のバージョンのマイナーバージョンアップまでならインストールされる 
# （以下の例だと、4.0.9 =>OK  4.1.0=>NG）
gem 'coffee-rails', '~> 4.0.0'
```

　
#### [補足] Railsデフォルト同梱のGemの変化

「Ruby on Rails チュートリアル」は、Rails5.0.0.1 を前提にしていて、今回インストールしたのは Rails5.1.1。
アプリケーション構築直後のGemfileを見ると、同梱されているGemに少し差がある。

・5.0.0.1 にあって 5.1.1 に無いもの（デフォルトから外されたもの）
jquery-rails
　　jQuery依存から脱却する方向に進んでいるらしい

・5.1.1 にあって 5.0.0.1 に無いもの（新しく追加されたもの）
capybara
selenium-webdriver
　　どちらもブラウザ操作を想定したテストのためのGemと思われる

　
### 【６】Puma を起動してアクセス確認
---

前回の記事では「bundle exec rails s」でPumaを起動したが、今回はrailsコマンドで起動してみる

```bash
$ cd /docker-host/share/webapps/hello_app

$ rails server
=> Booting Puma
=> Rails 5.1.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.8.2 (ruby 2.4.1-p111), codename: Sassy Salamander
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

で、Macのブラウザから「 http://localhost:3000 」で、Rails のデフォルトページ（Yay! You’re on Rails!）が表示されれば、ひとまずOK。

Puma側には、↓以下のようなアクセスログが表示される。

```bash
Started GET "/" for 172.17.0.1 at 2017-05-16 02:40:59 +0900
Cannot render console from 172.17.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by Rails::WelcomeController#index as HTML
  Rendering /usr/local/ruby/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.1.1/lib/rails/templates/rails/welcome/index.html.erb
  Rendered /usr/local/ruby/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.1.1/lib/rails/templates/rails/welcome/index.html.erb (11.4ms)
Completed 200 OK in 692ms (Views: 32.2ms)
```

Pumaを止めたいときは「Ctrl-C」で。

　
### 【７】コントローラとルーティング設定をちょこっといじってみる
---

せっかくなので、アプリケーションをちょこっといじって表示させてみる。

今回はアプリケーションを、Dockerのホスト（Mac側）との共有フォルダに作成したので、Macのエディタで編集できる。

① 既存のコントローラに、アクションメソッドを追加してみる

ここでは、Visual Studio Code 等のエディターで、アプリケーションのフォルダを開いて、以下のファイルを編集する。
そして、hello という、"nya---!" と表示するだけのアクションメソッドを定義してみる。

「app/controllers/application_controller.rb」

```ruby
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  # hello というアクションメソッドを追加ニャー！
  def hello
    render html: "nya---!"
  end

end
```

② TOPページを変更

いわゆる「ルーティング」の設定を編集して、上記の①で追加したアクションがルート（ / でアクセスされるTOPページ）になるように変更してみる

以下のファイルを編集する。

「config/routes.rb」

```ruby
Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

  # 「application」コントローラの「hello」アクションをルートとして設定する
  root 'application#hello'
  
end
```

③ んでー、表示確認

Pumaを停止している場合は、再度起動する

```bash
cd /docker-host/share/webapps/hello_app/
rails server
```

で、ブラウザから確認。
http://localhost:3000/
↓
nya---!


　
オッケー！
あまり進捗はないが、Railsアプリケーションの一端に触れることができた。
今日はここまで！！