2016-03-03 3 views
0

Два объекта Task и Project имеют ассоциацию has_many - belongs_to:Rails, как создать независимый объект

class Project < ActiveRecord::Base 
    has_many :tasks, dependent: :destroy 
end 

class Task < ActiveRecord::Base 
    belongs_to :project 
end 

контроллер задач, метод для создания связанного объекта:

def create 
    @project = Project.find(params[:project_id]) 
    @task = @project.tasks.build(task_params) 

    respond_to do |format| 
     if @task.save 
     format.html { redirect_to @project, notice: 'Task was successfully created.' } 
     format.js {} 
     format.json { render json: @task, status: :created, location: @task } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @task.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

View task # index, где содержится список всех задач. Задача индекса метод контроллера:

def index 
    @tasks = Task.all 
    @task= Task.new 
end 

Как создать независимый объект Task в этом методе?

Ошибка:

ActiveRecord::RecordNotFound in TasksController#create 
Couldn't find Project with 'id'= 

Могу ли я создать еще один метод create и использовать его?

+0

'Task.new'? Где вы хотите создать эту «независимую» задачу? –

+0

@MarekLipka В представлении 'task # index' –

ответ

1
def index 
    @tasks = Task.all 
    @task = Task.new 
end 

def create 
@task = if params[:project_id] 
    @project = Project.find(params[:project_id]) 
    @project.tasks.build(task_params) 
else 
    Task.new(task_params) 
end 
... 
+0

Ошибка:' ActiveRecord :: RecordNotFound в TasksController # create Не удалось найти проект с 'id' = ' –

+0

Что такое backtrace? –

+1

@AlexandrDmitrenko Ошибка в 'TasksController # create'. Вы должны иметь возможность создать задачу там независимо от 'project'. Я обновлю свой ответ –

2

добавьте следующие строки в Project модели.

class Project < ActiveRecord::Base 
    has_many :tasks, dependent: :destroy 
    accepts_nested_attributes_for :tasks, 
         :allow_destroy => true 
end 

и контроллер проектов

private  
def project_params 
     params.require(:project).permit(:name, ....., taks_attributes: [:id, .....,:_destroy]) 
end 
+0

@ Александр Дмитренко, добавьте вышеуказанные коды и отметьте –

+0

. Спасибо! –

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