初心者が久しぶりにプログラミングの学習を再開する時にすべきこと



# 始めに
プログラミング学習するが、何かしらの理由で学習時間が思うように確保できないことがある。ようやくまとまった時間を確保することが出来たとしても、何をしていたのか、何をしなければいけなかったのか忘れていることが多く、学習へのモチベーションはどんどん下がる。そして、学習に取り掛かるのが億劫になることもある。そういった時にすぐに学習に取り組めるようなリハビリ手順をここに残す。
# リハビリのポイント
プログラミング学習へのモチベーションを取り戻すに __前に進んでいる感覚__ を作ることが重要だと私は考える。
では、その __前に進んでいる感覚__ を作るにはどうすればよいか。
# 結論
画面に`hello would`と表示される程度の簡単なアプリを作成する
# 理由
簡単なアプリを作成するとがリハビリに最適だと考える理由は４つある。

・簡単なアプリであれば大きな手間もかからないから取り掛かるハードルが下がる
・簡単なアプリは目標が明確で達成しやすい
・難易度が低いので進んでいる感覚を作りやすい。
・難易度が物足りなければモデルの関連付けなども追加するなど自分で調節できる。

# 早速リハビリにとりかかろう

### Step1：アプリを作る準備をする

そもそもアプリってどうやってつくるんだっけ？状態な人も少なくないはず。
アプリを作成するには、まずアプリを作成する場所（ディレクトリ）を作成する
アプリはディレクトリの中に作る。なので、まずはアプリを作る場所（ディレクトリ）を作る必要がある。
新しいアプリを作成する方法の一つとしてターミナルでコマンドを入力する方法がある。
```:ターミナル
cd Desktop 　デスクトップフォルダに移動（ディレクトリの保管場所に移動）

mkdir rails このコマンドにより、Desktopディレクトリの中にrailsディレクトリを作成することができる。

cd rails アプリを作成するために、上記で作成したディレクトリの中に移動する

```
これでアプリを格納するためのディレクトリが作成出来た。

# Step2：アプリ作成に必要なファイルを作成

ターミナルで`rails new`とコマンドを入力すればアプリを動かすためにに必要なファイルが`railsディレクトリ`の中に一気に作成される。
```:ターミナル
rails new hello_world_sample 左記コマンドにより　”hello_world_sample”　というアプリが作成される。
```
これで一応アプリの作成の準備（アプリを作成するために場所、動かすためのファイルの作成）はできた。
# Step3：Hello would　と表示してみる。
アプリ作成に必要な`ファイル`を作成できた、次は`ルーティング`、`コントローラー`、`ビュー`などに触れてさらにリハビリを本格化していく。

作成した`ディレクトリ`を`テキストエディタ`で開く。
`テキストエディタ`で`ファインダー`の中の`desktop`の中の`rails`という`ディレクトリ`を開く（おや？っと思った方もこのまま進めてみてください）

### まずはデータベースの作成
データベースを作成するには、ターミナルで以下のコマンドを入力する
```:ターミナル
rails db:create
```

ここでさっそくリハビリ後の最初の試練が発生します。処理が期待通りに動いていないような感じのエラー文がブワーっと表示されます。

```:ターミナル
Usage:
  rails new APP_PATH [options]

Options:
      [--skip-namespace], [--no-skip-namespace]              # Skip namespace (affects only isolated engines)
      [--skip-collision-check], [--no-skip-collision-check]  # Skip collision check
  -r, [--ruby=PATH]                                          # Path to the Ruby binary of your choice
                                                             # Default: /Users/username/.rbenv/versions/3.0.3/bin/ruby
  -m, [--template=TEMPLATE]                                  # Path to some application template (can be a filesystem path or URL)
  -d, [--database=DATABASE]                                  # Preconfigure for selected database (options: mysql/postgresql/sqlite3/oracle/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc)
                                                             # Default: sqlite3
  -G, [--skip-git], [--no-skip-git]                          # Skip .gitignore file
      [--skip-keeps], [--no-skip-keeps]                      # Skip source control .keep files
  -M, [--skip-action-mailer], [--no-skip-action-mailer]      # Skip Action Mailer files
      [--skip-action-mailbox], [--no-skip-action-mailbox]    # Skip Action Mailbox gem
      [--skip-action-text], [--no-skip-action-text]          # Skip Action Text gem
  -O, [--skip-active-record], [--no-skip-active-record]      # Skip Active Record files
      [--skip-active-job], [--no-skip-active-job]            # Skip Active Job
      [--skip-active-storage], [--no-skip-active-storage]    # Skip Active Storage files
  -C, [--skip-action-cable], [--no-skip-action-cable]        # Skip Action Cable files
  -A, [--skip-asset-pipeline], [--no-skip-asset-pipeline]    # Indicates when to generate skip asset pipeline
  -a, [--asset-pipeline=ASSET_PIPELINE]                      # Choose your asset pipeline [options: sprockets (default), propshaft]
                                                             # Default: sprockets
  -J, [--skip-javascript], [--no-skip-javascript]            # Skip JavaScript files
      [--skip-hotwire], [--no-skip-hotwire]                  # Skip Hotwire integration
      [--skip-jbuilder], [--no-skip-jbuilder]                # Skip jbuilder gem
  -T, [--skip-test], [--no-skip-test]                        # Skip test files
      [--skip-system-test], [--no-skip-system-test]          # Skip system test files
      [--skip-bootsnap], [--no-skip-bootsnap]                # Skip bootsnap gem
      [--dev], [--no-dev]                                    # Set up the application with Gemfile pointing to your Rails checkout
      [--edge], [--no-edge]                                  # Set up the application with Gemfile pointing to Rails repository
  --master, [--main], [--no-main]                            # Set up the application with Gemfile pointing to Rails repository main branch
      [--rc=RC]                                              # Path to file containing extra configuration options for rails command
      [--no-rc], [--no-no-rc]                                # Skip loading of extra configuration options from .railsrc file
      [--api], [--no-api]                                    # Preconfigure smaller stack for API only apps
      [--minimal], [--no-minimal]                            # Preconfigure a minimal rails app
  -j, [--javascript=JAVASCRIPT]                              # Choose JavaScript approach [options: importmap (default), webpack, esbuild, rollup]
                                                             # Default: importmap
  -c, [--css=CSS]                                            # Choose CSS processor [options: tailwind, bootstrap, bulma, postcss, sass... check https://github.com/rails/cssbundling-rails]
  -B, [--skip-bundle], [--no-skip-bundle]                    # Don't run bundle install

Runtime options:
  -f, [--force]                    # Overwrite files that already exist
  -p, [--pretend], [--no-pretend]  # Run but do not make any changes
  -q, [--quiet], [--no-quiet]      # Suppress status output
  -s, [--skip], [--no-skip]        # Skip files that already exist

Rails options:
  -h, [--help], [--no-help]        # Show this help message and quit
  -v, [--version], [--no-version]  # Show Rails version number and quit

Description:
    The 'rails new' command creates a new Rails application with a default
    directory structure and configuration at the path you specify.

    You can specify extra command-line arguments to be used every time
    'rails new' runs in the .railsrc configuration file in your home directory,
    or in $XDG_CONFIG_HOME/rails/railsrc if XDG_CONFIG_HOME is set.

    Note that the arguments specified in the .railsrc file don't affect the
    defaults values shown above in this help message.

Example:
    rails new ~/Code/Ruby/weblog

    This generates a skeletal Rails installation in ~/Code/Ruby/weblog.

~/Desktop/rails
❯ rails s
Usage:
  rails new APP_PATH [options]

Options:
      [--skip-namespace], [--no-skip-namespace]              # Skip namespace (affects only isolated engines)
      [--skip-collision-check], [--no-skip-collision-check]  # Skip collision check
  -r, [--ruby=PATH]                                          # Path to the Ruby binary of your choice
                                                             # Default: /Users/kuramotokansei/.rbenv/versions/3.0.3/bin/ruby
  -m, [--template=TEMPLATE]                                  # Path to some application template (can be a filesystem path or URL)
  -d, [--database=DATABASE]                                  # Preconfigure for selected database (options: mysql/postgresql/sqlite3/oracle/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc)
                                                             # Default: sqlite3
  -G, [--skip-git], [--no-skip-git]                          # Skip .gitignore file
      [--skip-keeps], [--no-skip-keeps]                      # Skip source control .keep files
  -M, [--skip-action-mailer], [--no-skip-action-mailer]      # Skip Action Mailer files
      [--skip-action-mailbox], [--no-skip-action-mailbox]    # Skip Action Mailbox gem
      [--skip-action-text], [--no-skip-action-text]          # Skip Action Text gem
  -O, [--skip-active-record], [--no-skip-active-record]      # Skip Active Record files
      [--skip-active-job], [--no-skip-active-job]            # Skip Active Job
      [--skip-active-storage], [--no-skip-active-storage]    # Skip Active Storage files
  -C, [--skip-action-cable], [--no-skip-action-cable]        # Skip Action Cable files
  -A, [--skip-asset-pipeline], [--no-skip-asset-pipeline]    # Indicates when to generate skip asset pipeline
  -a, [--asset-pipeline=ASSET_PIPELINE]                      # Choose your asset pipeline [options: sprockets (default), propshaft]
                                                             # Default: sprockets
  -J, [--skip-javascript], [--no-skip-javascript]            # Skip JavaScript files
      [--skip-hotwire], [--no-skip-hotwire]                  # Skip Hotwire integration
      [--skip-jbuilder], [--no-skip-jbuilder]                # Skip jbuilder gem
  -T, [--skip-test], [--no-skip-test]                        # Skip test files
      [--skip-system-test], [--no-skip-system-test]          # Skip system test files
      [--skip-bootsnap], [--no-skip-bootsnap]                # Skip bootsnap gem
      [--dev], [--no-dev]                                    # Set up the application with Gemfile pointing to your Rails checkout
      [--edge], [--no-edge]                                  # Set up the application with Gemfile pointing to Rails repository
  --master, [--main], [--no-main]                            # Set up the application with Gemfile pointing to Rails repository main branch
      [--rc=RC]                                              # Path to file containing extra configuration options for rails command
      [--no-rc], [--no-no-rc]                                # Skip loading of extra configuration options from .railsrc file
      [--api], [--no-api]                                    # Preconfigure smaller stack for API only apps
      [--minimal], [--no-minimal]                            # Preconfigure a minimal rails app
  -j, [--javascript=JAVASCRIPT]                              # Choose JavaScript approach [options: importmap (default), webpack, esbuild, rollup]
                                                             # Default: importmap
  -c, [--css=CSS]                                            # Choose CSS processor [options: tailwind, bootstrap, bulma, postcss, sass... check https://github.com/rails/cssbundling-rails]
  -B, [--skip-bundle], [--no-skip-bundle]                    # Don't run bundle install

Runtime options:
  -f, [--force]                    # Overwrite files that already exist
  -p, [--pretend], [--no-pretend]  # Run but do not make any changes
  -q, [--quiet], [--no-quiet]      # Suppress status output
  -s, [--skip], [--no-skip]        # Skip files that already exist

Rails options:
  -h, [--help], [--no-help]        # Show this help message and quit
  -v, [--version], [--no-version]  # Show Rails version number and quit

Description:
    The 'rails new' command creates a new Rails application with a default
    directory structure and configuration at the path you specify.

    You can specify extra command-line arguments to be used every time
    'rails new' runs in the .railsrc configuration file in your home directory,
    or in $XDG_CONFIG_HOME/rails/railsrc if XDG_CONFIG_HOME is set.

    Note that the arguments specified in the .railsrc file don't affect the
    defaults values shown above in this help message.

Example:
    rails new ~/Code/Ruby/weblog

    This generates a skeletal Rails installation in ~/Code/Ruby/weblog.

```
、、、久しぶりにプログラミング学習した時にあるあるなのが、学習開始直後早々にエラーが発生し心が折れそうになること。
まあ、一旦ここは嫌な気持ちを横に置いておいて、よくエラー文を見てみましょう。
とりあえず英語が苦手な私は何かしらのツールで翻訳してみます。
```
使い方を説明します。
  rails new APP_PATH [オプション]を指定します。

オプションを指定します。
      [--skip-namespace], [--no-skip-namespace] # 名前空間をスキップする (孤立したエンジンのみに影響する)
      [衝突チェックをスキップする], [--no-skip-collision-check］
  -r, [--ruby=PATH] # お好みのRubyバイナリへのパスです。
                                                             # デフォルトは /Users/kuramotokansei/.rbenv/versions/3.0.3/bin/ruby
  -m, [--template=TEMPLATE] # アプリケーションのテンプレートへのパス (ファイルシステムのパスやURLでも可)
  -d, [--database=DATABASE] # 選択されたデータベースに対する事前設定 (オプション: mysql/postgresql/sqlite3/oracle/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc) # デフォルトでは，sqlite3が選択されます．
                                                             # デフォルト: sqlite3
  -G, [--skip-git], [--no-skip-git] # .gitignore ファイルをスキップする．
      [--skip-keeps], [--no-skip-keeps] # ソースコントロールの.keepファイルをスキップします．
  -M, [--skip-action-mailer], [--no-skip-action-mailer] # Action Mailer ファイルをスキップする。
      [--skip-action-mailbox], [--no-skip-action-mailbox] # Action Mailbox gemをスキップする。
      [--skip-action-text], [--no-skip-action-text] # Action Text gemをスキップする。
  -O, [--skip-active-record], [--no-skip-active-record] # アクティブレコードをスキップするファイルです。
      [--skip-active-job], [--no-skip-active-job] # アクティブなジョブをスキップする
      [--skip-active-storage], [--no-skip-active-storage] # アクティブなストレージのファイルをスキップする
  -C, [--skip-action-cable], [--no-skip-action-cable] # アクションケーブルのファイルをスキップする
  -A, [--skip-asset-pipeline], [--no-skip-asset-pipeline] # アセットパイプラインをスキップする生成のタイミングを示す
  -a, [--asset-pipeline=ASSET_PIPELINE] # アセットパイプラインの選択 [options: sprockets (default), propshaft] # デフォルトでは、スプロケットとプロップシャフトを選択します。
                                                             # デフォルト: sprockets
  -J, [--skip-javascript], [--no-skip-javascript] # JavaScript ファイルをスキップします。
      [--skip-hotwire], [--no-skip-hotwire] # Hotwireの統合をスキップする
      [--skip-jbuilder], [--no-skip-jbuilder] # jbuilderのgemをスキップする
  -T, [--skip-test], [--no-skip-test] # テストファイルのスキップ
      [--skip-system-test], [--no-skip-system-test] # システムテスト用ファイルをスキップする。
      [--skip-bootsnap], [--no-skip-bootsnap] # ブートスナップのgemをスキップする
      [--dev], [--no-dev] # Railsのチェックアウトを指すGemfileでアプリケーションをセットアップする。
      [--edge], [--no-edge] # GemfileがRailsのリポジトリを指すようにアプリケーションをセットアップする。
  --master, [--main], [--no-main] # Railsリポジトリのメインブランチを指すGemfileでアプリケーションをセットアップする。
      [--rc=RC] # railsコマンドの追加設定オプションが含まれるファイルへのパス
      [--no-rc], [--no-no-rc] # .railsrcファイルからの追加設定オプションの読み込みをスキップする。
      [--api], [--no-api] # API only のアプリのために小さいスタックを事前設定する。
      [--minimal], [--no-minimal] # 最小限の rails アプリを事前に設定する。
  -j, [--javascript=JAVASCRIPT] # JavaScript のアプローチを選択する [options: importmap (default), webpack, esbuild, rollup] # デフォルトは importmap です。
                                                             # デフォルト: importmap
  -c, [--css=CSS] # CSSプロセッサの選択 [オプション: tailwind, bootstrap, bulma, postcss, sass... check https://github.com/rails/cssbundling-rails] # デフォルト: インポートマップ。
  -B, [--skip-bundle], [--no-skip-bundle] # バンドルインストールを実行しない。

ランタイムオプションです。
  -f, [--force] # 既に存在するファイルを上書きする。
  -p, [--pretend], [--no-pretend] # 実行するが何も変更しない
  -q, [--quiet], [--no-quiet] # ステータスの出力を抑制する。
  -s, [-skip], [--no-skip] # すでに存在するファイルをスキップする

Railsのオプション。
  -h, [--help], [--no-help] # このヘルプメッセージを表示して終了する。
  -v, [--version], [--no-version] # Railsのバージョン番号を表示して終了

説明
    rails new' コマンドは、新しいRailsアプリケーションを、デフォルトの
    ディレクトリ構造および設定を指定したパスに作成します。

    を実行するたびに使用される追加のコマンドライン引数を指定することができます。
    rails new' は、ホームディレクトリの .railsrc 設定ファイル内で実行されます。
    または、XDG_CONFIG_HOME が設定されている場合は $XDG_CONFIG_HOME/rails/railsrc に指定します。

    .railsrc ファイルで指定された引数は、このヘルプの上記のデフォルト値に影響しないことに注意してください。
    ファイルに指定された引数は、このヘルプ メッセージの上記のデフォルト値には影響しないことに注意してください。

例を示します。
    rails new ~/Code/Ruby/weblog

    これは、~/Code/Ruby/weblogにRailsのスケルトンインストールを生成します。

www.DeepL.com/Translator（無料版）で翻訳しました。
```

意味を完全には理解できないけど、`PATH`や`rails new`のコマンドの使い方について説明されている気がします。
`rails new`のコマンドを入力した時はなんとなく成功していた気がするので, 　__`rails new`コマンドが正しく入力できていない説__　は保留にします。

`PATH`の意味がよく理解できていないのでこれを機会に __簡単__ に学習し、原因究明してみます。あまり時間をかけすぎないようにしましょう。モチベーションがどんどん削がれます。笑
### point: まずは意味を調べてイメージしてみる。
|単語|意味|
|:-:|:-:|
|path|進路、小道|

### point: つぎに簡単な解説記事を探してみる。
https://wa3.i-3-i.info/word1166.html
どうやらpathとはコンピュータのとっての進路みたいなものらしい。

### point: 予測してみる

`rails db:create`という`rails new`ありきの`コマンド`を入力して`パス`を指定するような指示や`rails new`の使い方について説明されているということは、もしかしたら`hello_would_sample`という`アプリ`が`コンピューター`に認識されていない可能性がある。`rails new`コマンド自体は正しく処理されているっぽい気がするので（コマンド入力時に明らかなエラーが表示されてなかった気がするから）`テキストエディタ`の設定か、もしくは`コマンド`を入力する`ディレクトリ`の階層が違うのかもしれない。

・テキストエディタのパス設定とか？
・違うディレクトリでコマンド入力している？

前者はちと大変そうなので、後者から試してみる。

### 結果は、、、
```:ターミナル
cd hello_world_sample アプリディレクトリに移動（筆者　この時点で、察する）

rails db:create　　データベース作成のコマンド入力

Created database 'db/development.sqlite3'   、、、成功した。
Created database 'db/test.sqlite3'

```
このように`リハビリ`の中で出てくる`エラー`を乗り越えるとさらに`モチベーション`も上がるので冷静に取り組み続けてみよう、リハビリは本当はじっくりと１日かけても構わないと私は考える。

# サーバーを起動してみる
サーバを起動してアプリが動いているか確かめる。
```:ターミナル
rails s サーバー立ち上げのコマンドを入力する
```
http://localhost:3000　画面が表示されるか確認する。

無事に画面が表示されていればとりあえずはアプリの立ち上げが完了した。あとはhello_wouldを表示する作業だけだ！

# ここから先を実装するために思い出さなければいけない大事な基本
### MVCモデルの理解

`Model`、`View`、`Contollor`の頭文字を取った略語であり、railsアプリを扱うために必要な概念の一つ。
それぞれの意味は
| 単語 | 意味 |
|:-:|:-:|
| Model| データベースとのやりとりを仲介してくれる |
| View`| ユーザーに見える部分の処理|
| Contollor| 処理の振り分け|

このように`プログラム`の役割を明確に分けて、`コード`の管理と運用保守を簡単にしている。

`ユーザー`からの`リクエスト`に対してどのように`サーバー`が`レスポンス`しているかもう一度思い出しながらアプリ制作を進めていく。

# まずはルーティングの設定
`ユーザー`からの`リクエスト`を最初に受け取るの`ルーター`である。`ルーター`は`リクエスト`の内容に応じて`コントローラー`の`アクション`に振り分けていく。

```rb:routes
Rails.application.routes.draw do
  # ***** 次を追加 *****
  get "/homes", to: "homes#index"
end
```
これはユーザーからHTTPメソッド `get:情報を一覧表示してほしいURL` そのために`homesコントローラー`の`indexアクション`へ繋げるという`コード`である。

# コントローラーの作成
一覧表示してほしいと`ユーザー`から`リクエスト`があった時は、`homesコントローラー`の`indexアクション`につなげると記載した.
なので、`homesコントローラー`を作成する。作成する方法はターミナルでのコマンド入力である。
```:ターミナル
touch app/controllers/homes_controller.rb なぜtouchで作成なのか、touchは元々ファイルの変更日時を更新するコマンドらしい、、、
```
すると`homesコントローラー`が作成される。中身が空っぽなので`アプリケーションコントローラー`を __継承__ するコードを記述する。そして、`index`アクションを追記します。
```rb:homes_contollor
class HomesController < ApplicationController
  def index

  end
end
```
`ユーザー`からの`リクエスト`を受け取った`ルーター`は`コントローラー`の`アクション`に振り分けます。`アクション`では受け取った`パラメーター`を`インスタンス変数`に入れて`view`に渡したり、`データベース`とやりとりするため`モデル`と連携したりします。今回はとくにそういった処理はないので、`view`とのパイプぐらいにしておきましょう。

# ビューの作成

ユーザーに表示する画面を作成します。
 - ターミナルでviewファイルを格納するための`homesディレクトリ`を作成
 - 表示画面ファイルを作成します。
 - 表示画面ファイルに表示内容を記述
```:ターミナル
mkdir app/views/homes　　viewファイルを格納する大枠

touch app/views/homes/index.html.erb　　アクションに応じた画面を表示するファイル　を作成
```
```erb:app/views/homes/index.html.erb
<h1>Hello World!!</h1>
```
実際に`Hello World!!`と画面に表示されるのか確かめましょう。
http://localhost:3000/homes

## 簡単なアプリ作成完了！　でも、簡単すぎる？？
ひとまずはここまで作業しているということはリハビリの効果は出ていると言っても過言ではないのでしょうか。
先ほど作った`めちゃめちゃ簡単なアプリ`でもいいのですが、少し物足りない感じも否めない。コントローラーのアクションや、データベースを全く使っていないですからね。
さらにリハビリの負荷を上げてみたい方はこのまま続けてみてください。

## まずはコントローラーからビューへデータを渡す
`クライアント`からのリクエストに対してルーターは指定されたURLのコントローラーのアクションを繋げます。コントローラーは適切なアクションを繋げます。
```rb:app/controllers/homes_controller.rb
class HomesController < ApplicationController
  def index
    # ***** 次を追加 *****
    @greet = "NEW Hello World!!"   #インスタンス変数に"Hello World!!"を格納
  end
end
```
*インスタンス変数とは、、、一旦おいておこう。

コントローラーのアクションで定義した`"NEW Hello World!!"`をviewに渡すにはインスタンス変数に格納する必要があった。
格納したインスタンス変数をビューへ渡すには以下のように記載する。
```erb:app/views/homes/index.html.erb
<%= @greet %>
```
そう、`"NEW Hello World!!"`を格納したインスタンス変数をビューに書き込む。すると値は保持されたままビューファイルに内容を渡すことができる。実際に渡すことが出来ているのかサーバーを立ち上げてみてみよう。
```:ターミナル
rails s
```
http://localhost:3000/homes

リンク先で無事に`"NEW Hello World!!"`と表示されていれば、コントローラーからビューにデータを渡すことが成功出来ている。

## モデルからコントローラーへデータを渡してみる
さらにリハビリの負荷をあげていく。
つぎはデータベースとのやりとりを仲介する`モデル`からコントローラーへデータを渡していく。

まずはモデルを作成する
```:ターミナル
touch app/models/user.rb
```

2022/10/06 途中