Создание веб-приложения с заданиями и получение такой ошибки SQLite3 :: SQLException: такой столбец отсутствует: tasks.list_id - PullRequest
0 голосов
/ 10 апреля 2020

Отображение /home/arthur/Desktop/application/todo/app/views/tasks/index.html.erb, где поднята строка # 7: SQLite3 :: SQLException: такого столбца нет: tasks.list_id

Эта ошибка появляется, когда я пытаюсь открыть созданный список для добавления новых задач. Я думаю, проблема в том, что приложение не может получить идентификатор списка, который я пытаюсь открыть. Но я не могу понять, что не так. (новый с ruby и рельсами). Нужно ли добавлять представления или что-то еще?
Task Controller

class TasksController < ApplicationController
  helper_method :task, :list, :tasks

  def create
    task.save

    redirect_to list_tasks_path(list)
  end

  def update
    task.update task_params

    redirect_to list_tasks_path(list)
  end

  def complete
    task.complete

    redirect_to list_tasks_path(list)
  end

  def destroy
    task.destroy

    redirect_to list_tasks_path(list)
  end

  private 

  delegate :tasks, to: :list, private: true

  def task 
    @task ||= params[:id] ? list.tasks.find(params[:id]) : list.tasks.new(task_params)
  end

  def list
    @list ||= List.find params[:list_id]
  end

  def task_params
    params.require(:task).permit(:title, :completed)
  end
end

и ListsController

class ListsController < ApplicationController
  #helper_method :list, :lists
  def index
    @lists = List.order('created_at')
  end 

  def new
    @list = List.new
  end

  def create
    @list = List.new list_params

    @list.save

    redirect_to lists_path
  end

  def edit
    @list = List.find params[:id]

    redirect_to lists_path
  end

  def update
    @list = List.find params[:id]

    @list.update list_params

    redirect_to lists_path
  end

  def destroy
    @list = List.find params[:id]

    @list.destroy

    redirect_to lists_path
  end

  private

  def list_params 
    params.require(:list).permit(:title)
  end

end

Просмотр индекса. html .erb

<div class="col-md-12">
    <h2>Tasks</h2>

    <div class="buffer-top"><%= link_to "New Task", new_list_task_path(list), class: 'btn btn-primary' %></div>

    <div class="buffer-top">
        <% tasks.each do |task| %>  <----------- this line
            <%= render partial: 'task', object: task %>
        <% end %>
    </div>

    <div class="buffer-top"><%= link_to "Back to Lists", lists_path, class: 'btn btn-primary btn-sm' %></div>

</div>
class Task < ApplicationRecord  
    belongs_to :lists

    def complete!
        self.completed = true
        save
    end
end

class List < ApplicationRecord

    has_many :tasks

end

схема

ActiveRecord::Schema.define(version: 2020_04_06_202846) do

  create_table "lists", force: :cascade do |t|
    t.string "title"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "tasks", force: :cascade do |t|
    t.string "title"
    t.boolean "completed"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

end

1 Ответ

1 голос
/ 10 апреля 2020

У вас есть belongs_to :lists в вашей модели задач, но нет list_id в соответствующей таблице tasks. Ваша таблица задач нуждается в миграции с t.integer "list_id", :null => false.

  create_table "tasks", force: :cascade do |t|
    t.integer "list_id", :null => false
    t.string "title"
    t.boolean "completed"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end
...