質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.83%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

投稿機能実装の際のエラー

kuuumi
kuuumi

総合スコア4

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

3回答

0グッド

0クリップ

305閲覧

投稿2023/03/24 02:45

編集2023/03/24 03:01

実現したいこと

投稿機能を実装したい

前提

railsで投稿機能を実装したアプリケーションを作っています。
ストロングパラメータを追加したいのですが、
投稿を更新するとエラーになってしまいます。
投稿するのはタイトルと本文のみです。

発生している問題・エラーメッセージ

param is missing or the value is empty: book
Did you mean?
body
controller
action
commit

試したこと

誤字、脱字がないか再記入
form_withの部分が間違っていないかテキストで確認
サンプルアプリとの比較
bookが空というのはどういう状況なのか
book.newが設定できているか

該当のソースコード

``` def new  @book = Book.new   end def create book = Book.new(book_params) book.save redirect_to '/top' end private def book_params params.require(:book).permit(:title, :body) end end ``````ここに言語を入力 ここに言語を入力 ```<h2>New book</h2> <%= form_with model: @book do |f| %> <div class="text-field"> <div>title</div> <%= f.text_field :title %> </div> <div class="text-field"> <div>body</div> <%= f.text_area :body %> </div> <div class="text-submit"> <%= f.submit 'Create Book' %> </div> <% end %> ### 試したこと 誤字、脱字がないか再記入 form_withの部分が間違っていないかテキストで確認 サンプルアプリとの比較 bookが空というのはどういう状況なのか book.newが設定できているか

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

winterboum

2023/03/24 07:56

>投稿を更新するとエラーになってしまいます。 とありますが、載っているのは new と create。 更新ではなく 作成 ですか?
kuuumi

2023/03/25 06:23

新規投稿作成になります。

回答3

0

自己解決

def indexにnewもいれないといけなかったのが原因でした。
回答いただいた方ありがとうございます。

投稿2023/03/31 03:25

kuuumi

総合スコア4

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

GPT-4manさんの回答に反応がないのはそれでは進展しなかった、からという想像で、

載っているcodeが「エラーが起きたときのままで修正はしていない」ものであるとすると、
そのエラーが出るのが??? です。
log/development.log をみて、エラーが出たときの
Started POST "/books" ,,,, のところを探し、そこの Parameters: の部分を見せてください。

投稿2023/03/26 23:20

winterboum

総合スコア22823

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

「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 %>

これで、投稿機能が正しく実装され、トップページに投稿一覧が表示され、新規投稿ページへのリンクが追加されるはずです。

投稿2023/03/24 04:52

quiz

総合スコア230

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.83%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。