2016-07-10 17 views
0

Ich entwickle eine Web-Anwendung für die Task-Management auf Schienen Rubin verwenden. Ich habe zwei Modelle user und task. Die Modelle sehen so aus:Verbände in Rails 4

class User < ActiveRecord::Base 
    has_many :tasks 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    def role?(role_name) 
    role == role_name 
    end 

    def self.assigned_user(task_params) 
    User.where("name = ?", task_params["assigned_to"]) 
    end 
end 



class Task < ActiveRecord::Base 
    belongs_to :user 
end 

was ich will, ist Aufgabe zuweisen Benutzer, wenn eine Aufgabe erstellt wird. Aber ich weiß nicht, wie es in create Aktion von tasks_controller zu tun ist. Meine Aktion erstellen wie diese

def create 
    @task = Task.new(task_params) 
    respond_to do |format| 
     if @task.save 
     @user = User.assigned_user(task_params) 
     @user.tasks << Task.last 
     format.html { redirect_to @task, notice: 'Task was successfully created.' } 
     format.json { render :show, status: :created, location: @task } 
     else 
     format.html { render :new } 
     format.json { render json: @task.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

sieht Wenn Admin eine Aufgabe zuweist, wenn seine erstellt, gibt es eine Fehlermeldung, dass undefined method tasks for #<User::ActiveRecord_Relation:0x007fe7b1c60610>. Kann jemand helfen, was kann das Problem sein?

+0

Was ist das? '@user = User.assigned_user (task_params)' Auch in der nächsten Zeile verwendet diesen: '@user.tasks << @ task', otherwhise es unnötig, eine Abfrage in der Datenbank zu tun. – developer033

+0

assigned_user ist eine Methode im Benutzermodell, die den aus der Datenbank abgerufenen Benutzer zurückgibt. –

Antwort

0

Der Fehler es gibt Ihnen ist, weil die where Methode ist eine Sammlung von Benutzern zurückkehren und Sie wollen einfach nur ein Benutzer:

def self.assigned_user(task_params) 
    User.where("name = ?", task_params["assigned_to"]).first 
end 

Sie wahrscheinlich Ihren Code zu überarbeiten wollen, wie ich glaube, dass Sie Probleme haben könnte, wenn name ist nicht eindeutig. Stellen Sie sicher, dass das Feld, das Sie zum Abrufen des Benutzers verwenden, eindeutig ist.

Der Code für die Schöpfung wie folgt aussehen:

def create 
    @task = Task.new(task_params) 
    respond_to do |format| 
    if @task.save 
     @user = User.assigned_user(task_params) 
     @user.tasks << @task 
     format.html { redirect_to @task, notice: 'Task was successfully created.' } 
     format.json { render :show, status: :created, location: @task } 
    else 
     format.html { render :new } 
     format.json { render json: @task.errors, status: :unprocessable_entity } 
    end 
    end 
end 
+0

@user ist noch nicht zugewiesen. Es gibt den Fehler 'nicht definierte Methodenaufgaben für die Nil-Klasse'. –

+0

Ich habe die Antwort bearbeitet. Bitte versuchen Sie es erneut. – chipairon

0

Nun, die Fehler, spricht für sich:

nicht definierte Methode Aufgaben für User :: ActiveRecord_Relation: 0x007fe7b1c60610>

def self.assigned_user(task_params) 
    User.where("name = ?", task_params["assigned_to"]) 
end 

where Methode gibt ein array (ActiveRecord_Relation), dann, da brauchen Sie nur ein Objekt zu holen, shoud es:

User.where(name: task_params["assigned_to"]).first 

oder noch besser:

User.find_by(name: task_params["assigned_to"]) 

Auch diese Zeile:

@user.tasks << Task.last 

unnötig eine Abfrage in der Datenbank tun.

So sollte es geändert werden:

@user.tasks << @task 

Hoffe, es hilft !!