## Rails勉強
Webサービスの技術の勉強をする。
---
# 1章
## Railsとは
動的なWebアプリケーションを開発するワークフレーム。
実際、GithubやHulu、Shopify、Twitterなどで使われる。
Webアプリケーションの作成に特化した **DSL(ドメイン固有言語)** を Ruby言語で実装していることにより、HTMLやデータモデルの生成、URL のルーティングなど、Webプログラミングで必要な多くの作業が簡単になる。
DSL(domain-specific language):特定のタスク向けに設計されたコンピュータ言語。
---
## 演習
1.Ruby on Railsで使うRuby gemはどのWebサイトにありますか?ヒント: 分からないときはとにかくググりましょう。
A.https://rubygems.org/
2.現時点でのRailsの最新バージョンはいくつですか?
A.6.0.1 or 6.0.2.re1
3.Ruby on Railsはこれまでに何回ダウンロードされたでしょうか?調べてみてください
A.201,599,038 (2019/12/03/14:00japan)
## railsインストール
```rails
gem install rails -v 5.1.6
```
-vオプションでバージョンを正確に指定。
## 最初のアプリケーション
rails new アプリケーション名でファイル構造を作成できる。
明示的に、バージョンも指定できる。
```rails
rails _5.1.6_ new hello_app
```
このコマンドを実行すると大量のファイルと標準化されたディレクトリ構造が作成される。
----
|ディレクトリ|用途|
|:--|:--|
| *app/* |モデル、ビュー、コントローラ、ヘルパーなどを含む主要なアプリケーションコード|
| *app/assets* |アプリケーションで使うCSS(Cascading Style Sheet)、JavaScriptファイル、画像などのアセット|
| *bin/* |バイナリ実行可能ファイル|
| *config/* |アプリケーションの設定|
| *db/* |データベース関連のファイル|
| *doc/* |マニュアルなど、アプリケーションのドキュメント|
| *lib/* |ライブラリモジュール|
| *lib/assets* |ライブラリで使うCSS (Cascading Style Sheet)、JavaScriptファイル、画像などのアセット|
| *log/* |アプリケーションのログファイル|
| *public/* |エラーページなど、一般(Webブラウザなど)に直接公開するデータ|
| *bin/rails* |コード生成、コンソールの起動、ローカルのWebサーバの立ち上げなどで使うRailsスクリプト|
| *test/* |アプリケーションのテスト|
| *tmp/* |一時ファイル|
| *vendor/* |サードパーティのプラグインやgemなど|
| *vendor/assets/* |サードパーティのプラグインやgemで使うCSS (Cascading Style Sheet)、JavaScriptファイル、画像などのアセット|
| *README.md* |アプリケーションの簡単な説明|
| *Rakefile* |rakeコマンドで使えるタスク|
| *Gemfile* |このアプリケーションに必要なGemの定義ファイル|
| *Gemfile.lock* |アプリケーションで使われるgemのバージョンを確認するためのリスト|
| *config.ru* |Rackミドルウェア用の設定ファイル|
| *.gitignore* |Gitに取り込みたくないファイルを指定するためのパターン|
---
## gemとは
Rubyのライブラリ。
## bundlerとは
gemの1つ。gem同士の互換性を保ちながらパッケージの種類やバージョンを管理してくれる仕組み。
Gemfileにgemのバージョンを記載していき、Gemfile.lockでバージョンを固定する。gemが更新されても、使用するバージョンをそのままにしてくれる。
### bundle install
railsは、gemfile.lookを元にgemのインストールをする。
この時、gemfile.lookに記述されてない、かつ、gemfileに記述されているgemがある場合、gemをインストールし、gemfile.lookを更新。
gemfileに新しくgemを記述した時に使用。
### bundle update
Bundlerは、gemfileを元にgemのインストールをする。その後、gemfile.lockを更新。
gemのバージョンを更新する時に使用。
## rails server
Railsアプリケーションを簡単に起動することができる。
Railsアプリケーションを表示するには、ローカルサーバーの場合はhttp://localhost:3000/をブラウザ
## 演習
1.デフォルトのRailsページに表示されているものと比べて、今の自分のコンピュータにあるRubyのバージョンはいくつになっていますか? コマンドラインでruby -vを実行することで簡単に確認できます。
Ruby version: 2.4.4 (x64-mingw32)
A.ruby 2.4.4p296
同様にして、Railsのバージョンも調べてみましょう。調べたバージョンはリスト 1.1でインストールしたバージョンと一致しているでしょうか?
A.Rails version: 5.1.6
一致している。
## MVC
Model-View-Controller
model:アプリケーションデータ、ビジネスルール、ロジック、関数
view:グラフや図などの任意の情報表現
controller:入力を受け取りmodelとviewへの命令に変換する

## Hello. world!
コントローラの確認
**app/controllers/applicaton_controller.rb**
```ruby
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
def hello
render html: "hello, world!"
end
end
```
以上を記述。 **render** メソッドは、レンダリング(rendering)という単語から名付けられたメソッド。renderの主な役割は、テンプレートを表示すること(=レンダリングすること)。MVCのControllerとViewのどちらでも使用できるが、使い方には微妙な違いがある。また、renderには様々なオプションが用意されており、登録されたデータをJSONやXMLで出力することもできる。
このアクションを使うために、Railsのルーターを編集。ルーターはコントローラとブラウザの間に配置され、ブラウザからのリクエストをコントローラに振り分ける。
ルーティングテーブルは以下のようにコントローラ名とアクション名を記述する。
```ruby
root 'contoller_name#action_name'
```
であり、今回は以下のようになる。
**config/routes.rb**
```ruby
Rails.application.routes.draw do
root 'application#hello'
end
```
コントローラルーティングテーブルを変更すると、ブラウザで表示できる。
## 演習
1.リスト 1.7のhelloアクションを書き換え、「hello, world!」の代わりに「hola, mundo!」と表示されるようにしてみましょう。
A.
**app/controllers/applicaton_controller.rb**
```ruby
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
def hello
render html: "hola, mundo!"
end
end
```
2.Railsでは「非ASCII文字」もサポートされています。「¡Hola, mundo!」にはスペイン語特有の逆さ感嘆符「¡」が含まれています (図 1.16)。「¡」文字をMacで表示するには、Optionキーを押しながら1キーを押します。この文字をコピーして自分のエディタに貼り付ける方が早いかもしれません。
A.
**app/controllers/applicaton_controller.rb**
```ruby
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
def hello
render html: "¡hola, mundo!"
end
end
```
3.リスト 1.7のhelloアクションを参考にして、2つ目のアクションgoodbyeを追加しましょう。このアクションは、「goodbye, world!」というテキストを表示します。リスト 1.9のルーティングを編集して、ルートルーティングの割り当て先をhelloアクションからgoodbyeアクションに変更します。
A.
**app/controllers/applicaton_controller.rb**
```ruby
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
def hello
render html: "hola, mundo!"
end
def goobbye
render html: "goodbye, world!"
end
end
```
**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
root 'application#goodbye'
end
```
## Gitによるバージョン管理(例)
復習として、
1.git checkout -b modify-README
-b:トピックブランチ(短期間だけ使う一時的なブランチ)
modify-README:ブランチ名
2.git branch
ブランチの確認
3.ファイルの変更
4.git status
ブランチの状態を確認
5.git commit -a -m "Improve the README file"
-a:git add -Aと同じ意味で省略できる。
-m:コミットメッセージをコマンドラインで直接指定
6.git checkout master
masterブランチへ移動
7.git merge modify-README
masterとmodify-READMEを合併
8.git branch -d modify-README
modify-READMEを削除
9.git push
Bitbucketに変更をプッシュ。
こんな感じ。
## Herokuのセットアップ
HerokuではPostgreSQLデータベースを使う。そのためには、本番 (production) 環境にpg gemをインストールしてRailsがPostgreSQLと通信できるようする。
HerokuではSQLiteがサポートされていないため、リスト 1.5の変更を行って、sqlite3 gemが本番環境に導入されないようにする。
**gemfile**開発環境
```ruby
group :development, :test do
gem 'sqlite3', '1.3.13'
gem 'byebug', '9.0.6', platform: :mri
end
```
**gemfile**本番環境
```ruby
group :production do
gem 'pg', '0.20.0'
end
```
本番用のgemを(この場合はpg gem)をローカルの環境にはインストールしないようにするために、bundle installに特殊なフラグ「--without production」を追加。
```ruby
bundle install --without production
```
### heroku編
```ruby
heroku --version
```
を確認。
Herokuのログイン
```ruby
heroku login --interactive
```
passwardの入力。
Herokuに新しいアプリケーションを作成
```ruby
heroku create
```
### herokuのデプロイ
```ruby
git push heroku master
```
アプリケーション名を変える
```ruby
heroku rename hello-12-5
```
こんな感じ。
## 演習
1.heroku helpコマンドを実行し、Herokuコマンドの一覧を表示してみてください。Herokuアプリのログを表示するコマンドはどれですか?
A.heroku logs
2.上の演習で見つけたコマンドを使って、Herokuアプリの最近のログ (log) を調べてみましょう。直近に発生したイベントは何でしたか? (このログを調べるコマンドを覚えておくと、本番環境の不具合を見つけるときに役立ちます)
A.ちょっとわからない
## herokuとは
プラットフォームサービスの1つで、
・Python/Java/Go/PHP/Node.JS/Ruby on Railsに対応可能
・salesforceが買収したサービス

**プラットフォーム** とは、サーバやデータベース、OS、プログラミング言語が使える環境などをインターネット越しに扱えるもの。
そのプラットフォームが使えるサービスである。そのサービスがどこまで用意しているかによって以下の4つに分類される。
**SaaS, PaaS, IaaS, DaaS** この中でherokuはPaaSに属する。
PaaSはPlatform as a Serviceの略で、
・ネットワークなどのインフラ
・OSなどのプラットフォーム
が整っているので、Ruby on Rails、Django、Spring、Node.jsなどで制約なく、アプリケーションを作成に集中できる。
saas, paas, iaas

## 分からなかったこと
ディレクトリ構造の1つ1つ説明。
bundle install と bundle updateの違い