2016-07-10 3 views
0

Я разрабатываю веб-приложение для управления задачами, используя ruby ​​on rails. У меня есть две модели: user и task. Модели выглядят так:Ассоциации в 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 

Что мне нужно - назначить задачу пользователю при создании задачи. Но я не знаю, как это сделать в create действии tasks_controller. Моя создать действие выглядит так

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 

Всякий раз, когда администратор назначает задачу, когда ее создатель, это дает ошибку говоря undefined method tasks for #<User::ActiveRecord_Relation:0x007fe7b1c60610>. Кто-нибудь может помочь, что может быть проблемой?

+0

Что это? '@user = User.assigned_user (task_params)' Также в следующей строке используйте это: '@user.tasks << @ task', otherwhise будет делать запрос в базе данных без необходимости. – developer033

+0

assign_user - это метод в модели пользователя, который возвращает пользователя, извлеченного из базы данных. –

ответ

0

Ошибка это дает вам, потому что метод where возвращает коллекцию пользователей, и вы хотите только одного пользователя:

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

Вы, вероятно, хотите, чтобы пересмотреть свой код, как я думаю, вы могли бы возникнуть проблемы, если name не уникален. Убедитесь, что поле, которое вы используете для извлечения пользователя, уникально.

Код для создания может выглядеть следующим образом:

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 еще не присвоен. Он дает ошибку «неопределенные задачи метода для класса Nil». –

+0

Я редактировал ответ. Повторите попытку, пожалуйста. – chipairon

0

Ну ошибка, говорит само за себя:

неопределенные задачи метод для пользователя :: ActiveRecord_Relation: 0x007fe7b1c60610>

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

where метод возвращает array (ActiveRecord_Relation), то, так как вам нужно только принести один объект, то Шоуда быть:

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

или даже лучше:

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

Также эта линия:

@user.tasks << Task.last 

Выполняет запрос в базе данных без необходимости.

Так оно и должно быть изменено на:

@user.tasks << @task 

Надеется, что это помогает !!

Смежные вопросы