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

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

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

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

Q&A

解決済

1回答

1284閲覧

Rails ActiveRecord::RecordNotFoundのエラーが解決できない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2021/05/21 07:16

編集2021/05/21 07:18

前提・実現したいこと

掲示板の様な簡単なアプリを作っています。
localhost:3000/projects/1/tasks/6のようにURLを入力すると、プロジェクトに紐づいていないTaskの詳細情報が確認できてしまうことが分かりました。

修正をしようコントローラーのコードを変更したところエラーが出ました。
どの様に調べたら良いかも分からず詰まっている為質問させていただきました。

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

エラー画面
エラー画面2

ActiveRecord::RecordNotFound at /projects/1/tasks/6 Couldn't find Task with 'id'=6 [WHERE "tasks"."project_id" = ?]

該当のソースコード

元々は
def set_task
@task = Task.find(params[:id])にしていましたが、プロジェクトに紐づいていないTaskの詳細情報が確認できてしまう為コード変更しました。

TasksController

1class TasksController < ApplicationController 2 before_action :set_project 3 before_action :set_task, only: %i[show edit update destroy] 4 5 def index 6 @tasks = @project.tasks 7 end 8 9 def show; end 10 11 def new 12 @task = Task.new 13 end 14 15 def edit; end 16 17 def create 18 @task = Task.new(task_params) 19 20 if @task.save 21 redirect_to [@project, @task], notice: 'Task was successfully created.' 22 else 23 render :new 24 end 25 end 26 27 def update 28 if @task.update(task_params) 29 redirect_to [@project, @task], notice: 'Task was successfully updated.' 30 else 31 render :edit 32 end 33 end 34 35 def destroy 36 @task.destroy 37 redirect_to project_tasks_url, notice: 'Task was successfully destroyed.' 38 end 39 40 private 41 42 def set_project 43 @project = Project.find(params[:project_id]) 44 end 45 46 def set_task 47 @task = @project.tasks.find(params[:id]) 48#変更前のコード @task = Task.find(params[:id]) 49 end 50 51 def task_params 52 params.require(:task).permit(:title, :status, :deadline, :completion_date, :description).merge(project_id: params[:project_id]) 53 end 54end

tasks/show.html.erb

show

1<p id="notice"><%= notice %></p> 2 3<p> 4 <strong>Title:</strong> 5 <%= @task.title %> 6</p> 7 8<p> 9 <strong>Status:</strong> 10 <%= @task.status %> 11</p> 12 13<p> 14 <strong>Deadline:</strong> 15 <%= @task.deadline.strftime('%Y-%m-%d %H:%M') if @task.deadline? %> 16</p> 17 18<p> 19 <strong>Completion date:</strong> 20 <%= @task.completion_date %> 21</p> 22 23<p> 24 <strong>Description:</strong> 25 <%= @task.description %> 26</p> 27 28<%= link_to 'Edit', edit_project_task_path(@task.project_id, @task) %> | 29<%= link_to 'Back', project_tasks_path %>

tasksRB

1class Task < ApplicationRecord 2 belongs_to :project 3 validates :title, presence: true 4 validates :status, presence: true 5 enum status: { todo: 0, doing: 1, done: 2 } 6 7 after_update :insert_complete_date 8 9 def insert_complete_date 10 update(completion_date: Time.current) if done? && completion_date.blank? 11 end 12end

route

1Rails.application.routes.draw do 2 resources :projects do 3 resources :tasks 4 end 5 resources :blogs do 6 resources :comments, only: [:create, :destroy] 7 end 8end 9

schema

1ActiveRecord::Schema.define(version: 2019_08_10_070746) do 2 3 create_table "blogs", force: :cascade do |t| 4 t.string "title", null: false 5 t.text "content", null: false 6 t.datetime "created_at", null: false 7 t.datetime "updated_at", null: false 8 end 9 10 create_table "comments", force: :cascade do |t| 11 t.string "name" 12 t.text "content", null: false 13 t.integer "blog_id" 14 t.datetime "created_at", null: false 15 t.datetime "updated_at", null: false 16 t.index ["blog_id"], name: "index_comments_on_blog_id" 17 end 18 19 create_table "projects", force: :cascade do |t| 20 t.string "name", null: false 21 t.integer "status", default: 0, null: false 22 t.date "release_date" 23 t.datetime "created_at", null: false 24 t.datetime "updated_at", null: false 25 t.index ["name"], name: "index_projects_on_name", unique: true 26 end 27 28 create_table "tasks", force: :cascade do |t| 29 t.string "title", null: false 30 t.integer "status", default: 0, null: false 31 t.datetime "deadline" 32 t.date "completion_date" 33 t.text "description" 34 t.integer "project_id" 35 t.datetime "created_at", null: false 36 t.datetime "updated_at", null: false 37 t.index ["project_id"], name: "index_tasks_on_project_id" 38 end 39 40end

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

他に記述するべきコードがありましたら、コメントお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

でたらめな値を入れているのなら、実際にそのprojectとtaskの組み合わせは存在しないのですから、エラーは出てしかるべきものではないかと考えます。

とはいえ、実運用ではエラー画面を出せませんので、rescue_fromなどを使って404ページにつなぐ、などの対応は必要です。

投稿2021/05/21 07:21

maisumakun

総合スコア146018

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問