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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

1032閲覧

railsのvalidatesでエラーメッセージが表示されない

oichoi

総合スコア7

Ruby on Rails

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/03/01 08:45

前提・実現したいこと

railsでtodoアプリを作成しています。
新しいタスクを入力する際に空白、31文字以上、同じタスクがある時の3つの場合でエラーメッセージを表示させたい

発生している問題

エラーメッセージが表示されません、、理由が全く分からないです。
よろしくお願いします。

該当のソースコード

todo.rb

class Todo < ApplicationRecord validates :content, presence: true,uniqueness: true, length: { maximum: 30 } end

routes.rb

Rails.application.routes.draw do get '/todos/search', to: 'todos#search' post '/todos/:id/done' => 'todos#done', as: 'done'#完了ボタン resources :todos # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root to: "todos#index" end

todos_controller.rb

class TodosController < ApplicationController before_action :set_todo, only: [:show, :edit, :update, :destroy,:done] # GET /todos # GET /todos.json def index @todos = Todo.all.order(created_at: :desc)#新しい順 @todo = Todo.new end # GET /todos/1 # GET /todos/1.json def show end # GET /todos/new def new @todo = Todo.new end # GET /todos/1/edit def edit end # POST /todos # POST /todos.json def create @todo = Todo.new(todo_params) respond_to do |format| if @todo.save format.html { redirect_to todos_url(@todo), notice: 'Todo was successfully created.' } format.json { render :show, status: :ok, location: @todo } else format.html { redirect_to todos_url(@todo.errors) } format.json { render json: @todo.errors, status: :unprocessable_entity } end end end # PATCH/PUT /todos/1 # PATCH/PUT /todos/1.json def update respond_to do |format| if @todo.update(todo_params) format.html { redirect_to @todo, notice: 'Todo was successfully updated.' } format.json { render :show, status: :ok, location: @todo } else format.html { render :edit } format.json { render json: @todo.errors, status: :unprocessable_entity } end end end # DELETE /todos/1 # DELETE /todos/1.json def destroy @todo.destroy respond_to do |format| format.html { redirect_to todos_url, notice: 'Todo was successfully destroyed.' } format.json { head :no_content } end end def done#完了ボタン if @todo.status=='undone' @todo.update(status:'done') else @todo.update(status:'undone') end redirect_to todos_url(@todo) end def search#検索 @todos = Todo.all.order(created_at: :desc)#新しい順 @todos2=@todos.where(['content LIKE ?', "%#{params[:search]}%"]) end private # Use callbacks to share common setup or constraints between actions. def set_todo @todo = Todo.find(params[:id]) end # Only allow a list of trusted parameters through. def todo_params params.require(:todo).permit(:content, :limit,:created_at,:status)#作成日時 #完了ボタン end end

index.html.erb

<p id="notice"><%= notice %></p> <h1><%= link_to 'todoリスト', todos_path %></h1> <h1><%= link_to '検索', todos_search_path %></h1> <%#ホームで入力%> <%= render 'form', todo: @todo %>  <table> <thead> <tr> <th>Content</th> <th>Limit</th> <th colspan="3"></th> </tr> </thead> <tbody> <% @todos.each do |todo| %> <tr> <td><%= todo.content %></td> <td><%= todo.limit %></td> <td><%= todo.created_at %></td><%#作成日時%> <td><%= button_to "#{todo.status}", done_path(todo), method: :post %></td><%#完了ボタン%> <td><%= link_to 'Show', todo %></td> <td><%= link_to 'Edit', edit_todo_path(todo) %></td> <td><%= link_to 'Destroy', todo, method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr> <% end %> </tbody> </table> <br>

_form.html.erb

<%= form_with(model: todo, local: true) do |form| %> <% if todo.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(todo.errors.count, "error") %> prohibited this todo from being saved:</h2> <ul> <% todo.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= form.label :content %> <%= form.text_area :content, id: :todo_content %> </div> <div class="field"> <%= form.label :limit %> <%= form.date_select :limit, id: :todo_limit %> </div> <div class="actions"> <%= form.submit %> </div> <% end %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

redirect_to todos_url index にリダイレクトしています。
indexでは @todo = Todo.new @todoをつくりなおしています。

ですから if todo.errors  は空です。

else @todos = Todo.all.order(created_at: :desc)#新しい順 format.html { render action: :index } format.json { render json: @todo.errors, status:

にしてみてください

投稿2020/03/01 13:18

winterboum

総合スコア23329

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

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

oichoi

2020/03/01 14:39

上記に書き換えたところ以下のエラーが出てしましました NameError in TodosController#create undefined local variable or method `    format' for #<TodosController:0x00007f0235682bb0> Did you mean? format
oichoi

2020/03/01 15:49

打ち間違いでした、解決しました ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問