とほほのRuby on Rails入門を参照しながら、よくわかっていないことをまとめた


とりあえずやってみようという感じで手を出した際の雑多なメモです。
お世話になったサイトは以下です。

https://www.tohoho-web.com/ex/rails.html


## 3.10 スキャフォールド（scaffold）とは何か

> ルーティングやコントローラー(controller)、ビュー(view)、モデル(model)とテーブル（データベース）の記述やファイルなどを自動で作成してくれるコマンドです。

https://udemy.benesse.co.jp/development/system/scaffold.html#:~:text=scaffold%E3%81%A8%E3%81%AF%E3%80%81Rails%E3%81%AB,%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%81%99%E3%80%82

実際に以下を実行してみると、大量のファイルが自動で生成されました。
しかも既にxxx.html.erb等のファイルの中身まで書かれている。ルーティングも自動で生成されているため、scaffoldを実行してすぐに動かすことができます。
``` ターミナル
rails generate scaffold User name:string age:integer
```

ただ、自分が理解できていないものもたくさん生成されるので、使っていいものかという気分に。


## 4.5 作成画面を作成する redirect_to

``redirect_to``の後ろくるのはURLやアクションだけだと思っていました。DBから取得したデータを指定すると、そのコントローラ（books_controller）の「showアクションに該当するページ」に遷移するそうです。

```ruby: app/controllers/books_controller.rb抜粋
  def create
    @book = Book.new(book_params)
    if @book.save
      redirect_to @book
    else
      render :new, status: :unprocessable_entity
    end
  end

  private
    def book_params
      params.require(:book).permit(:title, :author)
    end
```

https://qiita.com/shizen-shin/items/9c470b78430c649d9c7b#7-model%E5%90%8D%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A7%E6%8C%87%E5%AE%9A

## 4.5 作成画面を作成する form_with

``form_with``を使用すると、引数として渡されたモデルのインスタンス（オブジェクト）に値が入っているか否かによって、``submit``ボタンを押したときに、``create``に遷移するか、``update``に遷移するか、を勝手に決めてくれます。

https://qiita.com/yamaday0u/items/a3689bc48a7eff55929b

```html: app/views/books/new.html.erb
<h1>Books</h1>
<a href="/books">Return</a>
<%= form_with model: @book do |form| %>
  <div>
    <div><%= form.label :title %></div>
    <div><%= form.text_field :title %></div>
  </div>
  ~略~
  <div>
    <%= form.submit %>
  </div>
<% end %>
```

``label``と``text_field``については、Railsドキュメントの記載に沿って記せば、ラベルとテキストボックスが生成されると理解？しました。

https://railsdoc.com/page/label

https://railsdoc.com/page/text_field

## 4.6 編集画面を作成する patch

progateでルーティングに触れたときは、``patch``に触れていなかったので、「君、だれ？」となりました。

```ruby: config/routes.rb
Rails.application.routes.draw do
  ...
  patch '/books/:id', to: 'books#update'
end
```

> Ruby on Railsのroutes.rbでは、HTTPメソッドを使用してroutingを定義している。
> モデルのデータを更新したい場合、PATCHを使うことが推奨されている。
> https://yasasisa.hatenablog.com/entry/2019/11/04/141830 をもとに要約

POSTとPATCH/PUTは、「冪等性（べきとうせい）」という違いがあるそうです。冪等性とは、何度実行しても常に同じ結果になる操作のことで、POSTには、冪等性がなく、PATCH/PUTには冪等性があります。具体的な説明は、以下の記事を読みましょう。

https://yasasisa.hatenablog.com/entry/2019/11/04/141830

https://qiita.com/suin/items/316cb8aaf8dfcf11abae

## 5.4 パーシャルとは

パーシャルとは、「部分的な」、「一部の」を意味する言葉。部分テンプレートとも呼ばれる。ビューの一部を切り出して、他のビューから呼び出して使用する。

https://pikawaka.com/rails/partial_template

## 6.1 バリデーションを追加する full_messages_for(属性）

``full_messages``：すべてのエラーメッセージを取得する
``full_messages_for(属性)``：指定した属性のすべてのエラーメッセージを取得する

https://railsdoc.com/page/errors_full_messages

https://railsdoc.com/page/errors_full_messages_for

## 6.2 コメント機能を追加する アソシエーション

アソシエーションとは、モデルの関連付けに使用される概念です。6.2内にしれっと書かれている``has_many``のような記述が、それにあたります。
今回の場合ブックモデルが、複数(many)のcommentsを持つ(has)ということが規定されています。

```ruby: app/models/book.rb 抜粋
class Book < ApplicationRecord
  has_many :comments
  ...
end
```

以下では、``@book``という一つのデータに関連付けられた``comments``を作成しています。``@book``という一つのデータに関連付けられた``comments``を取得する場合は、``@book.comments``とします。

```ruby: app/controllers/comments_controller.rb 抜粋
@comment = @book.comments.create(comment_params)
```

アソシエーションについては、以下の記事に詳しく書かれています。

https://qiita.com/kazukimatsumoto/items/14bdff681ec5ddac26d1


### おわりに

色々なことが抜けているかとは思いますが、少し手を動かしただけでもアプリケーションの形になって楽しかったです。早くアプリケーション作れるようになりたいです。