🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Q&A

1回答

1689閲覧

バリデーションが実装できない

shankou_jp

総合スコア4

Ruby on Rails 5

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

0グッド

0クリップ

投稿2019/10/12 03:48

前提・実現したいこと

簡易的な本の投稿アプリケーションを作成中です。
投稿一覧機能と投稿機能を同じページに実装しており、
投稿時に「titel」「body」が空欄で投稿ボタンを押した際、
エラーメッセージ(英語のまま)が出るように実装したいです。

いろいろ調べて試して見た結果このコードが正解だと思うのですが、
コントローラーのif book.save
にエラーが出てしまい全く前に進まない状況です。
よろしくお願い致します。

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

undefined method ` if' for #BooksController:0x00007f28a4024788

Extracted source (around line #21):

def create
book = Book.new(book_params)
if book.save
redirect_to book_path(book.id)
flash[:notice] = 'Book was successfully created.'

該当のソースコード

[book_controller.rb]
class BooksController < ApplicationController

def index
@book = Book.new
@books = Book.all
end

def show
@book = Book.find(params[:id])
end

def new
end

def edit
@book = Book.find(params[:id])
end

def create
book = Book.new(book_params)
if book.save
redirect_to book_path(book.id)
flash[:notice] = 'Book was successfully created.'

else render 'index' end

end

def update
book = Book.find(params[:id])
book.update(book_params)
flash[:update] = 'Book was successfully updated.'
redirect_to book_path(book.id)
end

def destroy
@book = Book.find(params[:id])
@book.destroy
flash[:destroy] = 'Book was successfully destroyed.'
redirect_to books_path
end

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

end

[book.rb]
class Book < ApplicationRecord
end

class Book < ApplicationRecord
validates :title, presence: true
validates :body, presence: true
end

試したこと

モデルのバリデーションのコードやコントローラーのコードのスペルミスは行いました。
また、27行目のelsebの部分をrender 'create'
に変更したりしてみましたが、直りません。

補足情報(FW/ツールのバージョンなど)

ruby on rails
vagrant

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

undefined method ` if'というエラーメッセージが出ていますが、ifの前に全角スペースが入っています。

Rubyは全角スペースもプログラムの要素に使える言語なので、ふつうのスペースの代わりに使うと正常動作しません。

投稿2019/10/12 04:07

maisumakun

総合スコア145975

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shankou_jp

2019/10/12 05:08

すごく初歩的なミスでしたね、、ありがとうございます。 そこの問題は解決したのですが、投稿ボタンを押したら、下記のエラーが出てきてしまいました。 NoMethodError in Books#create Showing /vagrant/Bookers/app/views/books/index.html.erb where line #6 raised: undefined method `each' for nil:NilClass <h1>Books</h1> <% @books.each do |book| %> <p>Title</p> <span><%= book.title %></span> <p>Body</p> となり、エラー表示がされないのですが、問題はhtmlにあるのでしょうか。 バリデーション実装前は問題なく投稿できていたのですが、、、
siruku6

2019/10/12 06:44

>undefined method `each' for nil:NilClass @books に何もデータが入っていない(nilになっている)ようです。 nil.eachという形でeachを呼び出すことはできないよ、というエラーです。 というわけで、   render 'index' の前に   @books = Book.all を記載してみてはどうでしょう?
shankou_jp

2019/10/12 09:20

試してみたのですが、やはリダメでした。 Missing template books/#<Book::ActiveRecord_Relation:0x00007f0b1c041838>, application/#<Book::ActiveRecord_Relation:0x00007f0b1c041838> with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in: * "/vagrant/Bookers/app/views" と出てしまうので、一度見直しをしてみます、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問