文系卒だけどいきなりRuby on Railsの勉強をはじめてみた #1 ゼロからデプロイまで

#本記事の目的
この記事はプログラミング初心者である筆者のアウトプットが目的となっている。
RubyOnRailsの勉強をしていくなかで、わかったことや難しかったところをアウトプットしていく。
勉強には[Railsチュートリアル](https://railstutorial.jp/chapters/beginning?version=5.1#cha-beginning)を用いている。
#第1章 ゼロからデプロイまで
早速はじめの章から勉強を開始していく。
しかし、開始3秒でもう既にやるきの8割を持っていかれてしまった。

なぜか？

早速「デプロイ」という明らかに初心者にはすんなり理解できないであろう単語が章のタイトルに盛り込まれているからだ。

チュートリアルという言葉には「基礎から応用までを学べる教材」という意味が含まれているはずだが、このRailsチュートリアルは早速初心者を殺しにかかりに来ているようだ。

つべこべ言わずに「デプロイ」について調べた。
>デプロイ（英: deploy）とは、「配置する」「配備する」「展開する」といった意味の英語の動詞です。 日本語の中では、ソフトウェア開発の工程のうち、開発した機能やサービスを利用できる状態にする作業を指す語として用いられています。

ということらしい。
つまりこのチュートリアルをやるとなにかのサービスをゼロから作成して利用できる状態で提供できるようになるのだろう。

このチュートリアルではどうやら3つのアプリケーションを作成するらしい。

- hello
- toy
- sample

の3つだ。

Railsはどうやらめちゃくちゃ便利な言語で、有名企業もRailsを採用しているようだ。

- Twitter
- GitHub
- Airbnb

あたりがそうらしい。

Railsが人気である理由はオープンソースで、制約の少ないMITライセンスで公開されているからだとのこと。なにをいっているかさっぱりわからないので、わからない単語を調べる。
>オープンソースとは、ソフトウェアのソースコード（プログラミング言語で記述された文字列）を無償で公開し、誰でも自由に改良・再配布ができるようにしたソフトウェアのことです。 対して、一般的なソフトウェアは利用料が必要となります。 ソースコードを公開することはなく、その開発者でなければ修正などができません。


>MITライセンス（エムアイティーライセンス）（MIT License）というのは、オープンソースソフトウェアのライセンスのひとつで、無料で自由につかうことができる（制限がほんのすこししかない）のが特徴です。

くわしいことはよくわからないが、色んな人が使えて無料なんだろう。

チュートリアルでは演習問題が課される。飛ばしても問題はないが、飛ばさないほうがいいぞとのこと。
早速演習。

>Ruby on Railsで使うRuby gemはどのWebサイトにありますか？ヒント: 分からないときはとにかくググりましょう。
>>https://rubygems.org/

>現時点でのRailsの最新バージョンはいくつですか？
>>6.0.3.1

>Ruby on Railsはこれまでに何回ダウンロードされたでしょうか？調べてみてください。
>>228,312,165

早速アプリケーションを作成していく。
`rails new`というコマンドを打てば、railsアプリケーションのスケルトンが作成できるようだ。
>スケルトンとは、骨格、骸骨、骨組、粗筋、骨子、枠組、残骸、などの意味を持つ英単語。

早速`rails _5.1.6_ new hello_app`というコマンドを叩くと、hello_appというフォルダが作成され、中にはいろいろなフォルダやファイルが入っている。これがスケルトンというやつか。

次はBundlerを実行して、アプリケーションに必要なgemをインストールします、とのこと。
なにを言っているのかわからないので、ぐぐる。

>gemはRubyのパッケージ（ライブラリともいいます）です。
パッケージとは、プログラムの部品で便利な機能をひとまとめにしたものです。パッケージを使用することで、自分で1からコードを書くことなく機能を実装することができ、開発効率が大きく上がります。
Rubyのgemにも便利なものがたくさんあり、例えば、ユーザー登録機能や認証機能といった複雑な機能も、gemを使えば簡単に実装可能です。

>bundlerとは
bundlerとはgemを管理するためのツールで、bundler自体もgemの一種です。bundlerを使うことで、複数のgemの依存関係を保ちながらgemの管理ができます。

とりあえずチュートリアルに従って`bundle install`をするとエラーが出た。

```
You have requested:
  spring = 2.0.2

The bundle currently has spring locked at 2.1.0.
Try running `bundle update spring`

If you are updating multiple gems in your Gemfile at once,
try passing them all to `bundle update`
```

なにが起こったのかわからないが、Try running `bundle update spring`と書いてあるので、実行してみる。
すると、次のエラーが。

```
Bundler could not find compatible versions for gem "activesupport":
  In snapshot (Gemfile.lock):
    activesupport (= 5.1.7)

  In Gemfile:
    rails (= 5.1.6) was resolved to 5.1.6, which depends on
      activesupport (= 5.1.6)

    coffee-rails (= 4.2.2) was resolved to 4.2.2, which depends on
      railties (>= 4.0.0) was resolved to 5.1.7, which depends on
        activesupport (= 5.1.7)

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
```

なにが起こったのかはわからないが、Running `bundle update` will rebuild your snapshot from scratchと書いてあるので、実行してみる。その後、`bundle install`するといけた。
どんな問題があってなにが原因だったのかはわからないが、ぐぐったとおりにやったらいけた。

さて、演習。

>デフォルトのRailsページに表示されているものと比べて、今の自分のコンピュータにあるRubyのバージョンはいくつになっていますか? コマンドラインでruby -vを実行することで簡単に確認できます。
>>ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin19]

>同様にして、Railsのバージョンも調べてみましょう。調べたバージョンはリスト 1.1でインストールしたバージョンと一致しているでしょうか?
>>Rails 5.1.6
一致している。

次にMVCフレームワークというものについて学ぶらしい。
コントローラーの中にアクションを定義する。
そして、ルーターというものがデフォルトで先述のアクションを実行するように指示するらしい。

プログラミングではおきまりの「Hello, world」を表示させることに成功した。

>リスト 1.7のhelloアクションを書き換え、「hello, world!」の代わりに「hola, mundo!」と表示されるようにしてみましょう。
>>application_controller.rb内のhello, world!をhola, mundo!に変えるだけでOK

>Railsでは「非ASCII文字」もサポートされています。「¡Hola, mundo!」にはスペイン語特有の逆さ感嘆符「¡」が含まれています (図 1.16)18 。「¡」文字をMacで表示するには、Optionキーを押しながら1キーを押します。この文字をコピーして自分のエディタに貼り付ける方が早いかもしれません。
>>無事に表示される。

>リスト 1.7のhelloアクションを参考にして、２つ目のアクションgoodbyeを追加しましょう。このアクションは、「goodbye, world!」というテキストを表示します。リスト 1.9のルーティングを編集して、ルートルーティングの割り当て先をhelloアクションからgoodbyeアクションに変更します (図 1.17)。
>>defを使ってアクションを定義。その後、route.rbでgoodbyeアクションを指定するといけた。

次はGitでバージョン管理。
バージョン管理をするメリットは、

- 過去のある時点のバージョンに復元できる
- プログラムの変遷を辿れるようになる

などがあるっぽい。

>1.3.4.1と同じ変更を行い、本番アプリでも「hola, mundo!」を表示できるようにしてください。
>>コントローラー内のアクションと、routes.rbを書き換える。その後に`git add .` `git commit -a -m "hoge"` `git push` `git push 
heroku 
master`でいけた。

>1.3.4.1と同様、ルートへのルーティングを変更してgoodbyeアクションの結果が表示されるようにしてください。またデプロイ時には、Git pushのmasterをあえて省略し、git push herokuでデプロイできることを確認してみてください。
>>コントローラー内のアクションと、routes.rbを書き換える。その後に`git add .` `git commit -a -m "hoge"` `git push` `git push 
heroku 
master`でいけた。

#第2章 Toyアプリケーション
この章ではscaffoldジェネレータというスクリプトを使うとのこと。
要は、これを使うと大量の機能を自動的に生成できるっぽい。

早速`bundle install`をしていく。エラーが出るがもう怖くない。
一回対処しているからね。

次にgitコマンドを打っていく。gitがなかなかに難しい。

とりあえず、
`git init`はリポジトリにつき1回実行すればOK
`git add -A`は指定ディレクトリの中のものをすべてgitにぶちこむ準備をする
`git commit -m`はメッセージつきでgitへの出荷準備をする
くらいの理解でいる。

リポジトリはとりあえずデータを格納できる場所、位の認識。

次に`scaffold`を使うことでモデルを実装できるっぽい。
データベースをマイグレーションしましょうと言われたが、なんのことかもなんのためにやるのかもわからない。

>マイグレーション機能をひと言で説明すると、「SQLを書くことなくRubyでデータベース内にテーブルを作成することができる機能」です。

とのことらしい。なんかやらないとだめっぽい。

進めていくと、また演習に。

>CSSを知っている読者へ: 新しいユーザーを作成し、ブラウザのHTMLインスペクター機能を使って「User was successfully created.」の箇所を調べてみてください。ブラウザをリロードすると、その箇所はどうなるでしょうか?
>>残念だが、CSSを知らないので、なにをいっているのか理解できない。一旦飛ばそう。

>emailを入力せず、名前だけを入力しようとした場合、どうなるでしょうか?
「@example.com」のような間違ったメールアドレスを入力して更新しようとした場合、どうなるでしょうか?
>>どんな形式のemailを入力しようが、しまいが、ユーザーを作成できる。

>上記の演習で作成したユーザーを削除してみてください。ユーザーを削除したとき、Railsはどんなメッセージを表示するでしょうか?
>>User was successfully destroyed.

MVCについての現段階の理解は、Modelはデータベースみたいなもので、Viewは実際の画面のことという認識。Controllerがよくわからない。ModelとViewの架け橋みたいなものだろうか。

ぐぐってみると、次のような解説があった。あながち間違っていなかったのかも。

>・モデル(Model)：表示や入力に関連しない処理を担当
・ビュー(View)：表示や入力に関する処理を担当
・コントローラ(Controller)：ビューとモデルの橋渡し役を担当

そして、users_controller.rbの中身をみていくとなにやらいろんなアクションがある。editやdestroyなどだ。これはURLに表示されていたものと同一なので、ユーザーの編集や削除はこのコントローラーが関わっていたのだろう。

ちなみに、RESTはREpresentational State Transferの略ということはわかったもののそれがなんなのかはさっぱりわからなかった。
見なかったことにして次に進む。

すると、演習に。

>図 2.11を参考にしながら、/users/1/edit というURLにアクセスしたときの振る舞いについて図を書いてみてください。
>>editアクションを呼び出すんだろうというところまではわかる。
これは答えをぐぐろう…。


>図示した振る舞いを見ながら、Scaffoldで生成されたコードの中でデータベースからユーザー情報を取得しているコードを探してみてください。
>>`route  resources :users`か…？（まったく外しており、本当は@user = User.find(params[:id])らしい。）

>ユーザーの情報を編集するページのファイル名は何でしょうか?
>>edit.html.erbか…？

次はマイクロポストリソースを作成するみたいだ。`rails generate scaffold Micropost content:text user_id:integer`でつくれるっぽい。よくわからんけど、便利だなあ。

で、また、`rails db:migrate`をする。
よくわからんけどやらないといけないやつ。

>CSSを知っている読者へ: 新しいマイクロポストを作成し、ブラウザのHTMLインスペクター機能を使って「Micropost was successfully created.」の箇所を調べてみてください。ブラウザをリロードすると、その箇所はどうなるでしょうか?
>>CSSわからんのでパス。

>マイクロポストの作成画面で、ContentもUserも空にして作成しようとするどうなるでしょうか?
>>作成できる。

>141文字以上の文字列をContentに入力した状態で、マイクロポストを作成しようとするとどうなるでしょうか? (ヒント: WikipediaのRubyの記事にある１段落目がちょうど150文字程度ですが、どうなりますか?)
>>作成できる。

>上記の演習で作成したマイクロポストを削除してみましょう。
>>削除できる。

次に140文字制限をかけてみた。

>先ほど2.3.1.1の演習でやったように、もう一度Contentに141文字以上を入力してみましょう。どのように振る舞いが変わったでしょうか?
>>Content is too long (maximum is 140 characters)

>CSSを知っている読者へ: ブラウザのHTMLインスペクター機能を使って、表示されたエラーメッセージを調べてみてください。
>>CSSわからんのでパス。


次の演習。

>ユーザーのshowページを編集し、ユーザーの最初のマイクロポストを表示してみましょう。同ファイル内の他のコードから文法を推測してみてください (コラム 1.1で紹介した技術の出番です)。うまく表示できたかどうか、/users/1 にアクセスして確認してみましょう。
>>\<p>
  \<strong>first_content:\</strong>
  <%= @user.microposts.first.content %>
\</p>

>リスト 2.16は、マイクロポストのContentが存在しているかどうかを検証するバリデーションです。マイクロポストが空でないことを検証できているかどうか、実際に試してみましょう (図 2.16のようになっていると成功です)。
>>Content can't be blank

>リスト 2.17のFILL_INとなっている箇所を書き換えて、Userモデルのnameとemailが存在していることを検証してみてください (図 2.17)。
>>FILL_INを`:name`と`:email`にすればOK

次の演習。
>Applicationコントローラのファイルを開き、ApplicationControllerがActionController::Baseを継承している部分のコードを探してみてください。
>>class ApplicationController < ActionController::Base

>ApplicationRecordがActiveRecord::Baseを継承しているコードはどこにあるでしょうか? 先ほどの演習を参考に、探してみてください。ヒント: コントローラと本質的には同じ仕組みなので、app/modelsディレクトリ内にあるファイルを調べてみると...?)
>>ApplicationRecordって何のこと状態。よくわからないけど、`app/models/application_record.rb`の中に`class ApplicationRecord < ActiveRecord::Base`って書いてあるからこれだと思う。

第二章では、ユーザー（Users）や投稿（Microposts）を作成した。
その中で、必須入力項目を実装したり、文字制限を加えたりした。
MVCの理解も少し深まった。気がする。