«Принимает вложенные атрибуты» фактически не принимает атрибуты в модели - PullRequest
1 голос
/ 01 апреля 2012

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

Чего не хватает? Нужен ли оператор "attr available" в файле 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

1 Ответ

0 голосов
/ 01 апреля 2012

Основное различие между вашим примером и Railscast заключается в том, что вы делаете «многие ко многим», а не «один ко многим» (я думаю, у него в «Опросе было много вопросов»). Исходя из того, что вы описали, мне интересно, нужна ли модель HuntTask. Будут ли когда-нибудь повторно использоваться задачи для одной охоты в другой? Если предположить, что это так, то, похоже, ваш ответ здесь:

Rails вложенная форма с has_many: через, как редактировать атрибуты модели соединения?

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

hunt =  @hunt.hunt_tasks.build.build_task

Затем вам нужно изменить модель охоты, чтобы она включала:

accepts_nested_attributes_for :hunt_tasks

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

accepts_nested_attribues_for :hunt
...