从项目创建新任务时 TasksController#create 中的 NoMethodError

NoMethodError in TasksController#create when creating new task from project

我有一个项目模型和一个任务模型,但是一个任务可以有多个项目,反之亦然...所以我在两者之间创建了一个关系模型。现在从项目配置文件中,我希望能够创建一个任务并自动让它创建任务 新任务与创建它的项目之间的关系。

然而,当我尝试完成此操作时,出现以下错误:

NoMethodError in TasksController#create
undefined method `related?' for nil:NilClass

我的任务控制器

class TasksController < ApplicationController

  def new
    @task = Task.new
  end

  def create
    @task = current_user.own_tasks.build(task_params)
    if @task.save
      flash[:success] = "Your task has been created."
      redirect_to @task
      @project.relate!(@task) unless @project.related?(@task) # establishes task relationship w/ project only if relationship doesn't already exist
    else
      render 'task'
    end
  end

private

def task_params
  params.require(:task).permit(:title, :description, :user_id, taskrelationship_attributes: [:taskproject_id, :projecttask_id])
end

end

我的任务关系模型:

class TaskRelationship < ActiveRecord::Base
  belongs_to :taskproject, class_name: "Project"
  belongs_to :projecttask, class_name: "Task"
  validates :taskproject_id, presence: true
  validates :projecttask_id, presence: true
end

我的任务模型:

class Task < ActiveRecord::Base
  belongs_to :owner, :foreign_key=>'user_id', :class_name=>'User'

  has_many :reverse_taskrelationships, foreign_key: "projecttask_id",
                                   class_name: "TaskRelationship",
                                   dependent: :destroy
  has_many :taskprojects, through: :reverse_taskrelationships, source: :taskproject

  validates :title, presence: true
  validates :description, presence: true, length: { maximum: 140 }
end

结束 项目模型:

class Project < ActiveRecord::Base
  belongs_to :owner, :foreign_key=>'user_id', :class_name=>'User'

  has_many :tasks
  has_many :taskrelationships, foreign_key: "taskproject_id", dependent: :destroy
  has_many :projecttasks, through: :taskrelationships, source: :projecttask

  validates :title, presence: true
  validates :background, presence: true

  def related?(some_task)
   taskrelationships.find_by_projecttask_id(some_task.id)
  end

  def relate!(some_task)
   self.taskrelationships.create!(projecttask_id: some_task.id)
  end
end

我不确定我哪里错了...谢谢,

更新:

我在 create 方法的顶部添加了以下行,因为 marsAtomic 指出缺少...

@project = Project.find(params[:id]) 

仔细看错误:

undefined method `related?' for nil:NilClass

您正试图在 nil 对象上调用 related? 方法,在您的例子中是 Project。您的 create 方法没有在任何地方定义 @project

更新:

您添加的代码:

@project = Project.find(params[:id])

将找不到正确的项目,因为参数 :id 指的是任务的 ID 而不是其关联的项目。请记住,您在 tasks_controller.rb.

假设每个任务都通过您的 projecttask_id 字段引用了一个项目,您需要如下内容:

@project = Project.find(params[:projecttask_id])

请记住,projecttask_id 是一种奇怪的外键命名方式。将其命名为 project_id.

会更容易混淆