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