前提・実現したいこと
掲示板の様な簡単なアプリを作っています。
localhost:3000/projects/1/tasks/6のようにURLを入力すると、プロジェクトに紐づいていないTaskの詳細情報が確認できてしまうことが分かりました。
修正をしようコントローラーのコードを変更したところエラーが出ました。
どの様に調べたら良いかも分からず詰まっている為質問させていただきました。
発生している問題・エラーメッセージ
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/ツールのバージョンなど)
他に記述するべきコードがありましたら、コメントお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。