1

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

但是当我试图做到这一点我收到以下错误:

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 

我TaskRelationship型号:

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 

我不知道我要去哪里错了... THX,

UPDATE:

我已经添加了以下行作为marsAtomic指出的创建方法的顶部丢失...

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

我只是误解'current_user.own_tasks.build'中什么'own_tasks'? – 7urkm3n

+0

啊...我基本上在用户模型has_many:own_projects,:class_name =>'Project',也是 has_many:own_tasks,:class_name =>'Task'(这是关联任务或项目与'所有者') – BB500

+1

你可以只是'current_user.tasks.build(task_params)' – 7urkm3n

回答

2

Look clo sely的错误:

undefined method `related?' for nil:NilClass 

你试图调用一个nil对象的方法,在你的情况下,项目。您的create方法没有在任何地方定义@project

UPDATE:

您添加的代码:

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

将无法​​找到正确的项目,因为帕拉姆:id指的是任务而不是它的相关项目的ID。请记住,你在tasks_controller.rb

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

记住projecttask_id是怎么样的一种奇怪的方式来命名外键:

你会需要像下面这样,假设每个Task通过您的projecttask_id领域有一个项目的引用。将其命名为project_id将不那么令人困惑。

+0

thx mars ...所以我放在底部更新提到的线尝试和抢ID,但现在我得到: TasksController ActiveRecord :: RecordNotFound#create 找不到项目与' id'= – BB500

+1

@ BB500查看更新 – MarsAtomic

+1

@ BB500'@project = Project.find(params [:project_id])' – 7urkm3n