「ChatGPT(GPT-4)]により生成された文章です」
投稿機能を実装するために、次の手順を確認してください。
1.ルーティングの設定
config/routes.rbファイルで、resources :booksを追加して、booksリソースのルーティングが生成されることを確認してください。
ruby
1Rails.application.routes.draw do
2 # 他のルーティング
3 resources :books
4 # 他のルーティング
5end
2.コントローラーの作成
app/controllers/books_controller.rbに、以下のようにコントローラーを作成してください。
ruby
1class BooksController < ApplicationController
2 def new
3 @book = Book.new
4 end
5
6 def create
7 @book = Book.new(book_params)
8 if @book.save
9 redirect_to '/top'
10 else
11 render :new
12 end
13 end
14
15 private
16 def book_params
17 params.require(:book).permit(:title, :body)
18 end
19end
上記のコードでは、createアクションで@book.saveが失敗した場合、newビューが再表示されます。
3.ビューの作成
app/views/books/new.html.erbに、以下のようなフォームを作成してください。
erb
1<h2>New book</h2>
2
3<%= form_with model: @book, local: true do |f| %>
4 <div class="text-field">
5 <div>title</div>
6 <%= f.text_field :title %>
7 </div>
8
9 <div class="text-field">
10 <div>body</div>
11 <%= f.text_area :body %>
12 </div>
13
14 <div class="text-submit">
15 <%= f.submit 'Create Book' %>
16 </div>
17<% end %>
上記のコードでは、form_withにlocal: trueオプションを追加して、非同期通信を無効にしています。これは、Ajaxを使用せずに通常のHTTPリクエストを行うようにします。
4.モデルの作成
app/models/book.rbに、以下のようなモデルを作成してください。
ruby
1class Book < ApplicationRecord
2 validates :title, presence: true
3 validates :body, presence: true
4end
上記のコードでは、titleとbodyが存在することを確認するバリデーションを追加しています。
5.マイグレーションファイルの作成
ターミナルでrails generate model Book title:string body:textを実行して、マイグレーションファイルを作成します。その後、rails db:migrateを実行してデータベースにbooksテーブルを追加します。
これらの手順を確認して、アプリケーションの投稿機能が正しく実装されているかどうかを検証してください。
6.エラーメッセージの表示
フォームに入力したデータが不正な場合、エラーメッセージを表示するようにapp/views/books/new.html.erbを更新します。
er
1<h2>New book</h2>
2
3<% if @book.errors.any? %>
4 <div id="error_explanation">
5 <h3><%= pluralize(@book.errors.count, "error") %> prohibited this book from being saved:</h3>
6
7 <ul>
8 <% @book.errors.full_messages.each do |message| %>
9 <li><%= message %></li>
10 <% end %>
11 </ul>
12 </div>
13<% end %>
14
15<%= form_with model: @book, local: true do |f| %>
16 <div class="text-field">
17 <div>title</div>
18 <%= f.text_field :title %>
19 </div>
20
21 <div class="text-field">
22 <div>body</div>
23 <%= f.text_area :body %>
24 </div>
25
26 <div class="text-submit">
27 <%= f.submit 'Create Book' %>
28 </div>
29<% end %>
7.トップページへのリダイレクト
redirect_to '/top'の部分を、トップページへリダイレクトするように更新します。root_pathを使用することで、アプリケーションのルートパスにリダイレクトできます。
ruby
1class BooksController < ApplicationController
2 # 他のアクション
3
4 def create
5 @book = Book.new(book_params)
6 if @book.save
7 redirect_to root_path
8 else
9 render :new
10 end
11 end
12
13 # 他のアクション
14end
8.トップページに投稿一覧を表示
トップページに投稿された本の一覧を表示するために、app/views/top/index.html.erbを編集してください。以下のコードを追加して、投稿された本のタイトルと本文を表示します。
erb
1<h2>Books</h2>
2
3<table>
4 <thead>
5 <tr>
6 <th>Title</th>
7 <th>Body</th>
8 </tr>
9 </thead>
10
11 <tbody>
12 <% @books.each do |book| %>
13 <tr>
14 <td><%= book.title %></td>
15 <td><%= book.body %></td>
16 </tr>
17 <% end %>
18 </tbody>
19</table>
また、app/controllers/top_controller.rbを編集して、indexアクションで@booksインスタンス変数を定義します。
ruby
1class TopController < ApplicationController
2 def index
3 @books = Book.all
4 end
5end
9.新規投稿ページへのリンク
トップページに新規投稿ページへのリンクを追加することで、ユーザーが簡単に新規投稿ページにアクセスできるようになります。app/views/top/index.html.erbに以下のコードを追加して、リンクを作成してください。
<%= link_to 'New Book', new_book_path %>
これで、投稿機能が正しく実装され、トップページに投稿一覧が表示され、新規投稿ページへのリンクが追加されるはずです。