2012-03-31 6 views
1

Я работаю над проектом, где есть задачи, которые составляют охоту за мусорщиками. Когда пользователь создает новую охоту, мне бы хотелось, чтобы файл hunts/show.html.erb показывал охоту, а также задачи, связанные с этой охотой. Но модели дают мне проблемы. У меня есть настройка модели охоты на то, что она принимает вложенные атрибуты для модели задач. Поэтому, когда пользователь создает новую охоту, она также автоматически создает три задачи. Я могу получить новую охоту, чтобы сохранить, но я не могу сохранить эти новые задачи. Вот мои модели.«Принимает вложенные атрибуты», фактически не принимает атрибуты в модели

Что не хватает? Нужен ли мне запрос «attr доступный» в файле HunTasks.rb?

class Hunt < ActiveRecord::Base 

    has_many :hunt_tasks 
    has_many :tasks, :through => :hunt_tasks 
    accepts_nested_attributes_for :tasks, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true 
    attr_accessible :name 
    validates :name, :presence => true, 
        :length => { :maximum => 50 } , 
        :uniqueness => { :case_sensitive => false } 

end 


class Task < ActiveRecord::Base 

    has_many :hunt_tasks 
    has_many :hunts, :through => :hunt_tasks 
    attr_accessible :name  
    validates :name, :presence => true, 
        :length => { :maximum => 50 } , 
        :uniqueness => { :case_sensitive => false } 
end 


class HuntTask < ActiveRecord::Base  
    belongs_to :hunt # the id for the association is in this table 
    belongs_to :task 
end 

Вот что мой контроллер Hunt выглядит следующим образом:

class HuntsController < ApplicationController 

    def index 
    @title = "All Hunts" 
    @hunts = Hunt.paginate(:page => params[:page]) 
    end 

    def show 
    @hunt = Hunt.find(params[:id]) 
    @title = @hunt.name 
    @tasks = @hunt.tasks.paginate(:page => params[:page]) 
    end 

    def new 
    if current_user?(nil) then  
     redirect_to signin_path 
    else 
     @hunt = Hunt.new 
     @title = "New Hunt" 
     3.times do 
     hunt = @hunt.tasks.build 
     end 
    end 
    end 

    def create 
    @hunt = Hunt.new(params[:hunt]) 
    if @hunt.save 
     flash[:success] = "Hunt created!" 
     redirect_to hunts_path 
    else 
     @title = "New Hunt" 
     render 'new'  
    end 
    end 
.... 
end 
+0

эй снова Бен;) просто проверяя, вы запускаете миграцию для HuntTasks, правильно? Также, пожалуйста, покажите соответствующий код контроллера, thx, Michael. –

+1

btw Этот railscast довольно хорошо знает об этом: http://railscasts.com/episodes/196-nested-model-form-1part-1 –

+0

Привет! Здорово видеть вас снова! Чтобы ответить на ваш вопрос, да, я выполнил миграцию. Кроме того, я только что разместил контроллер поиска в основном разделе моего сообщения. И да, я работаю над Railscast 196, но г-н Бейтс делает это очень просто, в то время как я считаю, что это долгий трудный труд. –

ответ

0

Основное различие между примером и railscast является то, что вы делаете много-ко-многим, а не один ко многим (я думаю, что его у Обзора было много Вопросов). Основываясь на том, что вы описали, мне интересно, нужна ли модель HuntTask. Являются ли задачи для одной охоты когда-либо повторяться в ходе другой охоты? Предполагая, что они есть, то похоже, ваш ответ здесь:

Rails nested form with has_many :through, how to edit attributes of join model?

Вы должны изменить свое новое действие в контроллере, чтобы сделать это:

hunt = @hunt.hunt_tasks.build.build_task 

Затем вам нужен изменить модель Hunt включать:

accepts_nested_attributes_for :hunt_tasks 

И изменить модель HuntTask включать:

accepts_nested_attribues_for :hunt 
+0

Я играл с этой настройкой, но без особого успеха. Я всегда в конечном итоге с ошибкой объединения 'ArgumentError в HuntsController # новый \t \t Никакой связи не найдено для имени' hunt_tasks'.' –

+0

Просто утверждают: «accepts_nested_attributes_for: hunt_tasks» линия была помещена после того, как оба «has_many: hunt_tasks» и ' has_many: задачи, через ... 'в вашей модели Hunt? – Adam

+0

Да, это так. –

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