【Railsチュートリアル】第2章 Toyアプリケーション 演習と解答

#演習と回答
## 2.2.1 ユーザーページを探検する
###2.2.1 - 1
CSSを知っている読者へ: 新しいユーザーを作成し、ブラウザのHTMLインスペクター機能を使って「User was successfully created.」の箇所を調べてみてください。ブラウザをリロードすると、その箇所はどうなるでしょうか?
 
```html

<p id="notice">User was successfully created.</p>
```

リロード前は上のようになっていて

```html

<p id="notice"></p>
```
リロードしたあとは`User was successfully created.`が消えて空白になっていた。

###2.2.1 - 2
emailを入力せず、名前だけを入力しようとした場合、どうなるでしょうか?

名前だけでも登録ができる。
###2.2.1 - 3
「@example.com」のような間違ったメールアドレスを入力して更新しようとした場合、どうなるでしょうか?

更新できる。

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

```sql

User Destroy (1.1ms)  DELETE FROM "users" WHERE "users"."id" = ?  [["id", 3]]
```
などと表示される。

##2.2.2 MVCの挙動
###2.2.2 - 1
図 2.11を参考にしながら、/users/1/edit というURLにアクセスしたときの振る舞いについて図を書いてみてください。

割愛。

###2.2.2 - 2
図示した振る舞いを見ながら、Scaffoldで生成されたコードの中でデータベースからユーザー情報を取得しているコードを探してみてください。Hint: set_userという特殊な場所の中にあります。

```ruby:
private
  # Use callbacks to share common setup or constraints between actions.
  def set_user
    @user = User.find(params[:id])
  end
```

###2.2.2 - 3
ユーザーの情報を編集するページのファイル名は何でしょうか?

`edit.html.erb`

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

```html

<p id="notice">Micropost was successfully created.</p>
```

リロード前は上のようになっていて

```html

<p id="notice"></p>
```
リロードしたあとはMicropost was successfully created.が消えて空白になっていた。

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

作成できる。

###2.3.1 - 3
141文字以上の文字列をContentに入力した状態で、マイクロポストを作成しようとするとどうなるでしょうか?（ヒント: WikipediaのRubyの記事にある設計思想の引用文が140文字を超えているので、これをコピペしてみましょう）

作成できる。

###2.3.1 - 4
上記の演習で作成したマイクロポストを削除してみましょう。

それぞれ削除しました。

##2.3.2 マイクロポストをマイクロにする
###2.3.2 - 1
先ほど2.3.1.1の演習でやったように、もう一度Contentに141文字以上を入力してみましょう。どのように振る舞いが変わったでしょうか?

作成できず、エラーメッセージが出るようになった。

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

```html

<textarea name="micropost[content]" id="micropost_content">Ruby には Perl や Python とは決定的に違う点があり、それこそが Ruby の存在価値なのです。それは「楽しさ」です。私の知る限り、Ruby ほど「楽しさ」について焦点を当てている言語は他にありません。Ruby は純粋に楽しみのために設計され、言語を作る人、使う人、学ぶ人すべてが楽しめることを目的としています。しかし、ただ単に楽しいだけではありません。Ruby は実用性も十分です。実用性がなければ楽しめないではありませんか。
— まつもとゆきひろ、Ruby プログラミング入門 まえがき 監修者よりのページ</textarea>
```

##2.3.3 ユーザーはたくさんマイクロポストを持っている
###2.3.3 - 1
ユーザーのshowページを編集し、ユーザーの最初のマイクロポストを表示してみましょう。同ファイル内の他のコードから文法を推測してみてください（コラム 1.2で紹介した技術の出番です）。うまく表示できたかどうか、/users/1 にアクセスして確認してみましょう。
    
```sql

first_user.microposts
  Micropost Load (0.1ms)  SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? LIMIT ?  [["user_id", 1], ["LIMIT", 11]]
 => #<ActiveRecord::Associations::CollectionProxy [#<Micropost id: 7, content: "hi!", user_id: 1, created_at: "2021-01-23 06:05:27", updated_at: "2021-01-23 06:05:27">]> 
2.6.3 :006 > 
```

###2.3.3 - 2
リスト 2.18は、マイクロポストのContentが存在しているかどうかを検証するバリデーションです。マイクロポストが空でないことを検証できているかどうか、実際に試してみましょう（図 2.17のようになっていると成功です）。

できたので割愛。

###2.3.3 - 3
リスト 2.19のFILL_INとなっている箇所を書き換えて、Userモデルのnameとemailが存在していることを検証してみてください（図 2.18）。

```ruby:user.rb

class User < ApplicationRecord
  has_many :microposts
  validates :name, presence: true
  validates :email, presence: true
end
```

##2.3.4 継承の階層
###2.3.4 - 1
Applicationコントローラのファイルを開き、ApplicationControllerがActionController::Baseを継承している部分のコードを探してみてください。
    
```ruby:application_controller.rb

class ApplicationController < ActionController::Base #この行
  def hello
    render html: "hello, world"
  end
end
```
    
###2.3.4 - 2
ApplicationRecordがActiveRecord::Baseを継承しているコードはどこにあるでしょうか? 先ほどの演習を参考に、探してみてください。ヒント: コントローラと本質的には同じ仕組みなので、app/modelsディレクトリ内にあるファイルを調べてみると...?)

```ruby:app/models/application_record
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end
```

##2.3.5 アプリケーションをデプロイする
###2.3.5 - 1
本番環境で２〜３人のユーザーを作成してみましょう。
作成できました。

###2.3.5 - 2
本番環境で最初のユーザーのマイクロポストを作ってみましょう
作れました。

###2.3.5 - 3
マイクロポストのContentに141文字以上を入力した状態で、マイクロポストを作成してみましょう。リスト 2.14で加えたバリデーションが本番環境でもうまく動くかどうか、確認してみてください。

うまく動きました。

##さいごに
Railsチュートリアル第2章をクリアしました！
エラーに遭遇しましたが、きちんと文章を読む、検索する、めげない、で解決へたどり着けました。これからもっと難しくおもしろくなってくるようで、楽しみです。

* MVCモデルを知った
* RESTアーキテクチャを知った
* データモデルを作成した
* Twitterっぽい何かを作ることができた
* エラーに遭遇しても検索して解決へたどり着けた