1

Ich habe ein Projektmodell und ein Aufgabenmodell, aber eine Aufgabe kann viele Projekte haben und umgekehrt ... also habe ich ein Beziehungsmodell zwischen den beiden erstellt. Jetzt aus dem Projektprofil, ich möchte in der Lage sein, eine Aufgabe zu erstellen und automatisch erstellen die Aufgabe und die Beziehung zwischen der neuen Aufgabe und dem Projekt, aus dem es erstellt wurde.NoMethodError in TasksController # erstellen beim Erstellen neuer Aufgabe aus Projekt

aber wenn ich versuche, dies zu tun Ich bin die folgende Störung zu erhalten:

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

Meine Aufgaben-Controller

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 

Mein TaskRelationship Modell:

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 

Meine Aufgabe Modell:

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 

Ende Projektmodell:

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 

Ich bin nicht sicher, wo ich falsch gehe ... thx,

UPDATE:

ich die folgende Zeile hinzugefügt haben bei der Anfang der create -Methode, wie marsAtomic darauf hingewiesen wurde, fehlte ...

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

Ich missverstehe nur was "eigene_Tasks" in 'current_user.own_tasks.build'? – 7urkm3n

+0

ah ... ich habe im Grunde im Benutzermodell has_many: own_projects,: class_name => 'Project' und auch has_many: own_tasks,: class_name => 'Aufgabe' (dies ist die Aufgabe oder das Projekt mit einem ' Besitzer ') – BB500

+1

könnten Sie einfach 'current_user.tasks.build (task_params)' – 7urkm3n

Antwort

2

Blick clo sely am Fehler:

undefined method `related?' for nil:NilClass 

Sie versuchen, die Methode auf einem Null-Objekt zu nennen, in Ihrem Fall, Projekt. Ihre create Methode definiert @project nirgendwo.

UPDATE:

Ihr Mehr Code:

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

nicht das richtige Projekt finden, weil die param :id auf die ID der Aufgabe bezieht sich statt dessen zugehörigen Projekt. Denken Sie daran, Sie sind in tasks_controller.rb.

Sie würden so etwas wie die folgenden benötigen, jede Aufgabe angenommen hat einen Verweis auf ein Projekt über Ihre projecttask_id Feld:

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

Beachten Sie, dass projecttask_id Art eine seltsame Art und Weise ist ein Fremdschlüssel zu nennen . Es wäre weniger verwirrend, es project_id zu nennen.

+0

thx mars ... also habe ich die im Update erwähnte Zeile am unteren Rand platziert, um die ID zu holen, aber jetzt bekomme ich: ActiveRecord :: RecordNotFound in TasksController # create Konnte Projekt mit 'nicht finden id '= – BB500

+1

@ BB500 Siehe Update – MarsAtomic

+1

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