初心者がRailsガイドを1から100まで読んでみる　Railsをはじめよう編その１　Hello, Rails!

#⚫どうしてこの記事を書こうと思ったのか？
 なにか発信したくなったから

#⚫今日読むところ
Railsをはじめよう
https://railsguides.jp/getting_started.html

#⚫読んだ
##1.本ガイドの前提条件
 RailsガイドはRails初心者のために書きました。Rubyの知識ないとちょっと辛いかもしれないから先にRuby勉強した方がいいよ、とのこと。
 Railsの知識はもちろんのこと、Rubyの知識もあんまり無いけど、Railsについて勉強したいからとりあえずRubyはすっ飛ばす。(本当は良くないと思うけど、寄り道してたらなんか飽きそう)

##2.Railsとは何か
 Rails(正式名称Ruby on Rails)はRubyで作られたWebアプリケーションフレームワークらしい。
 Rubyって？Webアプリケーションって？フレームワークって？もーやめてよー

 Rubyはプログラミング言語のひとつで日本人のまつもとゆきひろさんが開発したもの。プログラミング言語というとJavaとかCOBOLとかVBとかC言語とかいろんな種類があるけど要はパソコンにお仕事してもらうための命令集みたいなものだ。犬に例えると、飼い主(プログラマ)、待て(プログラミング言語)、犬(パソコン)で犬に待てっていうと言うこと聞くみたいな。そんで、待てって言うのも日本語(Ruby)だったり英語(Java)だったりスワヒリ語(COBOL)だったりするわけだ。僕は日本人なのでRubyで喋ろうと思う。犬に命令を聞いてもらうためにはしつけが必要だ。そして、パソコンが命令を聞いてくれるためにはインストールが必要だ。誰しも生まれつきなんでも出来るわけじゃない。![IMG_20180915_204635.jpg](https://qiita-image-store.s3.amazonaws.com/0/283826/7f2d4fb1-f49c-f7c8-cb17-6294801ee30c.jpeg)

 Webアプリケーションとは、ブラウザ(Chromeとか、IEはもう古いか)上で動作するシステムのこと。もし僕がRailsでWebアプリを作成したら、それは作成途中は自分のパソコン(ローカル環境)上で動いていたかもしれないけど、みんなに使ってもらうにはインターネットに繋がったパソコンに載せてあげる必要がある。アプリが動くパソコンのことをサーバーって言うよね。サーバーを自前で用意するのはお金がかかるから、レンタルサーバーっていう手もある。あと、ドメインの登録もしなきゃいけない。それは住所の登録みたいなもので、WebアプリにアクセスするためのURL(httpsほにゃららみたいなやつ)を自分のWebアプリ用に登録することだ。住所がわかんないと誰も遊びに来てくれない。つまり、インターネットに繋がったサーバーの上に僕の作ったWebアプリを載せて、ドメインを登録することでやっとみんながブラウザ上からWebアプリを使うことが出来る。WebアプリとWebサイトの違いはなんだとか議論があるけど、基本は同じ感じ。(Webサイトは情報提供をして、Webアプリはユーザーと対話するらしい) Webの歴史的に言えば、もともと共有パソコンの中のファイルをみんなで見れるようにしたのが始まりで、それから基本は変わってないと思う。

フレームワークはシステム開発においてよく作る機能をまとめて簡単に実装できるようにしてパックしたものだ。日本語にすると枠組みとか骨組みとか。例えば犬にダンスをさせようとした時には、左手を上げて右手を上げてぐるっと回って…と一つ一つの動作を命令してダンスにする必要がある。RubyでWebアプリを作ろうとするとほんと細かいところも自分で命令文を書かなくちゃいけなくなる。ちまちま命令するのめんどくさい！ダンスしろって命令したらダンスしてくれ！って思ってできたのがフレームワークだ。フレームワークであるRailsをインストールすると、すっごく簡単な命令を書くだけでWebアプリができあがる。RailsはRubyのフレームワークなのでRailsの文法にそってプログラミングすると、裏でRubyが動く。犬自体は何も変わっていない。僕のダンスしろっていう命令を拾って噛み砕いて犬に伝えるありがたいやつがフレームワークなのだ。フレームワークのおかげで、ダンスしてもらうにはどうすれば良いかを考える時間を、コサックダンスにしようか、バレエにしようか、阿波踊りにしようか、もしくは創作ダンスにしようかとクリエイティブなことを考える時間に使える。

 冒頭の３行を理解するためにこんなにかかってしまった。知らなきゃいけない前提が多すぎるよもう。
 フレームワークって色々あるけど、Railsの良いところは少ないコード量で簡単にWebアプリがつくれて、技術者の皆さんはWebアプリが楽しくなるような、そんなフレームワークですって。またまたーそんなうまい話あるわけないでしょー。
 Railsの哲学は二つあります。ひとつめは、「同じことを繰り返すな (Don't Repeat Yourself: DRY)」。これって美しいコードって何か考える時によく言われる言葉だ。何回も同じ処理を書けばそれだけ処理は無駄に増えるし、コードが見づらくなる。バグも増える。ふむふむ。確かにウェットな僕は振られた恋人のことを何回も繰り返し思い出して反芻している。ドライな方がいいね。
 もうひとつは、「設定より規約が優先される (Convention Over Configuration)」。決まりごとでがっちがちにすることで、まるでレールの上に乗ってるようにWebアプリ開発ができるってこと？ 確かに自由度高いゲームとか苦手。
 
##3.Railsプロジェクトを新規作成する
 お！やっとそれっぽい感じ。
 「本ガイドを活用するための最善の方法は、以下の手順を取りこぼさずに1つずつ実行することです。どの手順もサンプルアプリを動かすのに必要なものであり、それ以外のコードや手順は不要です。｣ ガイドもまるでレールに載せてくるようだあ。
 このガイドの手順に従えばblogっていうWebサービスができあがるらしい。
 ＄記号があるのはコマンドプロンプト上で実行するコマンドだよ。

###3.1.Railsのインストール
 Rubyがインストールされてるか以下のコマンドで確かめてみてね
(Macならターミナル、Windowsならコマンドプロンプト。$は打たなくていいよ)

`$ruby -v`
Railsを使うにはバージョン2.2.2以上じゃないとダメだって。
SQLite3のバージョンも確認してみよう。

`$sqlite3 --version`
RubyもSQLite3もバージョンが表示されなかったらご自身のPCにインストールされてないので、インストールしてからRailsをインストールしよう（RubyとSQLite3のインストールの方法は割愛）

Railsをインストールするにはgem installコマンドを使えばいいよ。

`$gem install rails`
gemってなんだよ…

####gemとは
ややこしいんだけど…
まずRubyGemsっていうものがあります。
RubyGemはRubyのバージョン管理ツールでRubyをインストールしたら勝手についてくるそう。
上記のgemコマンドを提供しているのもこのRubyGemsで、RubyやRubyのためのライブラリを管理しているらしい（Rubyのバージョンアップとかライブラリのインストールとか）
ライブラリっていうのはRubyが使える武器を増やすためのものってイメージで、そのライブラリのことをgemって呼ぶらしい。
上記の

`$gem install rails`
ってコマンドもRubyGemsがrailsっていうgem(新しい武器）をRubyのために持ってきてあげてるってイメージなのかなあ。
![IMG_20180915_213021.jpg](https://qiita-image-store.s3.amazonaws.com/0/283826/8e9b6eb4-1c6c-47e8-deec-7f657d25a9bd.jpeg)

ちなみに以下のコマンドで現在あなたのRubyGemsが管理しているgemたちが確認できるよ

`$gem list`
結果はこんな感じ
<img width="301" alt="スクリーンショット 2018-09-15 21.21.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/66552573-919e-84c8-1bbe-2a4a8e7c9506.png">



以下のコマンドでバージョンが確認できたらRailsは正常にインストールできてるよ。

`$rails --version`

###3.2.ブログアプリケーションを作成する

Railsにはジェネレータという名のスクリプトが用意されていて、コマンドを打つことで必要なものを取り揃えてくれるらしい。ものは試しだ。

`$rails new blog`
なんかぶわーってでた
<img width="246" alt="スクリーンショット 2018-09-15 22.22.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/c52413e9-2f8b-ad2c-1f01-10c703544133.png">

なんかいっぱいできてた
<img width="629" alt="スクリーンショット 2018-09-15 22.23.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/8a94f0e4-ffca-9382-c0ab-2879c80abef5.png">

きっとこれがRailsのレールの上なんだろうな〜

`$cd blog`
↑で、できたてほやほやのblogアプリの中に入ってみよう
なんか各フォルダの説明が書いてあるけど今見てもよくわかんないや笑
とばそう
とりあえずこれでアプリの原型はできたらしい

##4.Hello,Rails!

定番のやつですね

###4.1.Webサーバーを起動する
できたてほやほやのblogくんはすでに起動できる状態になってるってすげー

`$rails server`
このコマンドを打つとwebサーバーが起動するらしい

<img width="409" alt="スクリーンショット 2018-09-15 22.39.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/3ca8c683-2046-c8c3-359a-8f7819d8a2e1.png">

Pumaってなんだろ。後で調べるか。

この状態で
(http://localhost:3000)
をブラウザで開くと

<img width="643" alt="スクリーンショット 2018-09-15 22.42.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/d93f04e5-68c5-1068-9aab-8b810d67380a.png">
こんな画像が表示される。これでサーバーが正常に動作していることの確認になる。Yay!

ターミナル上もなんか処理ログみたいなのが吐かれている（画像をだしたよ！みたいな感じのログだ）
<img width="563" alt="スクリーンショット 2018-09-15 22.43.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/9f112622-7198-2712-b617-6996a41fc78c.png">

###4.2.Railsに"Hello!"と挨拶させる
そう。パソコンはこちらから挨拶しろと言わない限り挨拶なんてしないのだ。

 「Railsに"Hello"と表示するには、最低でもコントローラとビューが必要です。」
なにいってんだ？

####MVCモデルとは
システムの機能をModelとViewとControllerに分けて構成するやり方のことをMVCモデルという。
（あれ？　モデルVCモデルになってね？）
・Model：データ、ビジネスロジック担当
・View：ブラウザ表示担当
・Controller：ModelとViewの橋渡し役担当
Modelが生徒会でViewが新聞部の記事作成担当でControllerが新聞部のスクープ収集担当みたいな？（あってるか？）


つまり 「Railsに"Hello"と表示するには、最低でもコントローラとビューが必要です。」この文章を解読すると、新聞に"Hello"と書くためには最低でも新聞部のスクープ収集担当と記事作成担当がいるよってことだな。
スクープ収集担当が収集してきた"Hello"というネタを記事作成担当が書き起こすのだろう。

「コントローラは、アプリケーションに対する特定のリクエストを受け取って処理するのが役割です。ルーティング は、リクエストをどのコントローラに割り振るかを決定するためのものです。1つのコントローラに対して複数のルーティングがあるのはよくあることです。そしてコントローラにはいくつかの アクション があります。いくつかの異なるルーティングに対して、それぞれ異なるアクションを割り当てることができます。それぞれのアクションは、情報を集めてビューに送り出すのが役割です。」

リクエスト？ルーティング？アクション？
まじでなにいってんだ？

とりあえず進めるか

`$rails generate controller Welcome index`
このコマンドでコントローラをひとつ産み出すことができるらしい。
<img width="425" alt="スクリーンショット 2018-09-15 23.16.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/6855b00a-2bdd-94cb-2368-9ef2a7a966aa.png">
なんかいっぱいクリエイトされた。

app/controllerの下にwelcome_controller.rbなるものが増えている
<img width="354" alt="スクリーンショット 2018-09-15 23.17.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/fc726865-3791-30a6-2a29-7b2195a0815e.png">

中身はこんな感じ

```welcome_controller.rb
class WelcomeController < ApplicationController
  def index
  end
end
```
indexという名前のメソッドができてる。
さっきのコマンド
`$rails generate controller Welcome index`
の意味は
Welcomeというコントローラを生成し、それにindexというアクションを付け加えます
ということらしい。
Welcomeくんという新聞部員（スクープ担当）を勧誘しました。
Welcomeくんはindex新聞に書く記事を集めてきます。
ってイメージなのかな？

もうちょっと進めようか
app/views/welcomeの下にindex.html.erbというファイルがある。
その中身を書きかえろとガイドさんはおっしゃる

```index.html.erb
<h1>Hello, Rails!</h1>
```
とりあえずしたがっておくか

###4.3.アプリケーションのHomeページを設定する
configの下にあるroutes.rbを編集してくださいって。

```routes.rb
Rails.application.routes.draw do
  get 'welcome/index'
  root 'welcome#index'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```

`root 'welcome#index'`
のとこが追記したところ。get 'welcome/index'はさっきgenerateした時にできたのかな？
「root 'welcome#index'と記述することで、アプリケーションのルートURLへのアクセスをwelcomeコントローラのindexアクションに割り当てるようRailsに指示が伝わります。同様に、get 'welcome/index'はhttp://localhost:3000/welcome/index
というリクエストをwelcomeコントローラのindexアクションに割り当てます。」

ははーん？なんか重要そうなことを言ってるぞ。
routeとrootって意味が違うよなー
rootの設定をすることで
(http://localhost:3000) で開いたページが
(http://localhost:3000/welcome/index) で開いたものと同じになるらしい
(試しに開いてみるとどっちも"Hello,Rails!"と表示される）
<img width="347" alt="スクリーンショット 2018-09-15 23.42.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/14733d4b-d5b3-cde6-762a-48f6bf532166.png">
さっきまでYay!が表示されていたページが変わっちゃった。これがrootの設定か。

そもそもなんで(http://localhost:3000/welcome/index) に飛ぶと"Hello,Rails"が表示されるのだろう。

まとめるとこんな感じ
![IMG_20180915_235234.jpg](https://qiita-image-store.s3.amazonaws.com/0/283826/87202dd4-3833-3b96-497b-6a310c3b713f.jpeg)

welcome/indexとブラウザ上に打ち込むことによって、それがブラウザからblogアプリ(Rails)へのリクエストになります。
リクエストの内容はwelcomeコントローラのindexアクションをしてねというもの。
リクエストはRailsがroutes.rbに書かれている名簿を確認して各コントローラに渡します。
今回はget 'welcome/index'と書かれていたのでこれはWelcomeコントローラくんの仕事だと判断したRailsはリクエストを彼に渡します。
そのリクエストをうけとったWelcomeコントローラくんは、indexビューくんに画面表示して！と命令します。
（アクション名＝ビュー名なのですね）
indexビューくんはindex.html.erbの内容を元に画面表示をします。

なるほど役者が多い
（しかもまだモデルくんという真打が…）

とりあえずこれでHello,World!は表示できました。
こんにちは世界！


その２
https://qiita.com/Natsuki_on_Rails/items/5e99be6e524c575f1ccc