2015-06-19 2 views
1

У меня есть модель с автореферентными ассоциациями:Как создать дочерний объект для существующего объекта с ассоциативными ассоциациями?

class Task < ActiveRecord::Base 
    has_many :subtasks, class_name: 'Task', foreign_key: "parent_id" 
    belongs_to :parent, class_name: 'Task' 
    accepts_nested_attributes_for :subtasks, allow_destroy: true 
    belongs_to :user 
    belongs_to :project 
end 

смысл:

  • Я создаю задачи
  • Для некоторых задач я хочу добавить некоторые подзадачи
  • Когда я «Я перехожу к task_path -/tasks /: id, action» tasks # show »- я вижу атрибуты задачи, но ниже я хочу иметь возможность добавлять подзадачи.

И некоторые вопросы дополнительно:

  1. Это хороший способ использовать одну модель для задач и подзадач?
  2. Нужно ли мне создавать второй контроллер?

Благодарим вас и простите за мой английский.

UPD1: TasksController

class TasksController < ApplicationController 

    before_action :find_task, only: [:show, :edit, :update, :destroy] 

    def index 
    @tasks = Task.where("parent_id IS ?", nil) 
    end 

    def show 
    end 

    def new 
    @task = Task.new 
    @task.subtasks.build 
    end 

    def edit 
    end 

    def create 
    @task = Task.create(task_params) 
    if @task.errors.empty? 
     redirect_to @task 
    else 
     render 'new' 
    end 
    end 

    def update 
    @task.update_attributes(task_params) 
    if @task.errors.empty? 
     redirect_to @task 
    else 
     render 'edit' 
    end 
    end 

    def destroy 
    @task.destroy 
    redirect_to tasks_path 
    end 

    private 

    def task_params 
    params.require(:task).permit(:title, :description, :priority, :status, :scheduled, :deadline, subtasks_attributes: [:title]) 
    end 
    def find_task 
    @task = Task.find(params[:id]) 
    end 
end 

show.html.erb для задач /: идентификатор (только черновик)

<%= @task.deadline %> 
<%= @task.title %> 
<%= @task.description %> 
<% @task.subtasks.each do |s| %> 
    <br><%= s.title %> 
    <%= link_to 'Delete', [s], method: :delete, data: { confirm: 'Are you sure?' } %> 
<% end %> 

<%= simple_form_for @task do |t| %> 
<%= t.simple_fields_for :subtasks do |f| %> 
    <%= f.error_notification %> 
    <div class="form-inputs"> 
    <%= f.input :title %> 
    </div> 

    <div class="form-actions"> 
    <%= f.button :submit %> 
    </div> 
<% end %> 
<% end %> 

ответ

0

Ответ: Нам нужен один контроллер - TasksController. Мы добавляем параметр "accepts_nested_attributes_for" в модели 'Task':

class Task < ActiveRecord::Base 
    has_many :subtasks, class_name: 'Task', foreign_key: "parent_id" 
    belongs_to :parent, class_name: 'Task' 
    accepts_nested_attributes_for :subtasks, allow_destroy: true 
    belongs_to :user 
    belongs_to :project 
end 

Для TasksController мы добавим дополнительные параметры для подзадачи:

def task_params 
    params.require(:task).permit(:title, :description, :priority, :status, :scheduled, :deadline, subtasks_attributes: [:title]) 
end 

Форма для подзадач выглядит следующим образом:

<%= simple_form_for @task do |t| %> 
    <%= t.simple_fields_for :subtasks, @task.subtasks.build do |f| %> 
    <div class="form-inputs"> 
     <%= f.input :title %> 
    </div> 
    <div class="form-actions"> 
     <%= f.button :submit %> 
    </div> 
    <% end %> 
<% end %> 

Спасибо вам большое! :)

1

вы можете использовать accept_nested_attributes_for для subtasks

http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

также рассмотреть возможность использования simple_form для передачи вложенных атрибутов модели

https://github.com/plataformatec/simple_form/wiki/Nested-Models

при таком подходе нет необходимости создавать отдельный контроллер для подзадач

Я думаю, что его хорошо использовать subtasks для одной parent задачи

+2

Как ни странно, OP [уже используемые вложенные атрибуты] (http://i.imgur.com/dewIK8Y.png). Отредактировал это по какой-то причине. –

+1

oh ok, но для достижения значений подзадач в той же форме нам нужно «принять вложенные атрибуты для» – yogendra689

+0

Да, я удалил его до и теперь вернулся. У меня проблемы с контроллером и просмотр для этого. – odinsy

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