Возможно ли создание модели с вложенными атрибутами на рельсах 4 без fields_for?

у меня 2 модели

1) Проект

class Project < ActiveRecord::Base
  has_many :tasks
  accepts_nested_attributes_for :tasks

  validates :priority, presence: true
  validates_date :due_date, :after => lambda {Date.current}
  validates_length_of :name, minimum: 5, maximum: 40
  validates_length_of :description, minimum: 10, maximum: 200
end

2) Задачи (которые относятся к проекту)

class Task < ActiveRecord::Base
  belongs_to :project, dependent: :destroy

  validates_length_of :name, minimum: 3, maximum: 50
end

Мой контроллер:

   def create
      @project = Project.new(project_params)
      @project.save!
      redirect_to projects_path   
  end

  def new   
    @project = Project.new

    respond_to do |format|
      format.html
      format.js
    end

  def project_params
    params.require(:project).permit(:name, :description, :due_date, :priority, 
    tasks_attributes: [:name])
  end

Когда я нажимаю кнопку отправки в форме, я вижу, что приходит запрос с вложенным атрибутом (задача), поэтому он сохраняется правильно, однако сохраняется только проект, а не задача .

Я понял, что не использую field_for (потому что я генерирую его через Javascript во время выполнения).

Кто-то знает, как решить эту ситуацию?

РЕДАКТИРОВАТЬ:

Я попробовал project.tasks.build в новом действии, но поведение осталось прежним.

Запрос, который достигает действия создания:

{"utf8"=>"✓",
"authenticity_token"=>"GItsCNKllmEEYnhihDLx9QRuObWPNL4qwZBKt56Yss0=",
"project"=>{"name"=>"werwfeb3b33b",
"description"=>"rb3rb3rb3rb3rb",
"due_date"=>"2014-01-21",
"priority"=>"2"},
"tasks"=>{"0"=>{"name"=>"2e2ev"}}}

И код функции javascript (coffeescript), который создает поле времени выполнения «имя» модели задачи:

AddTaskComponent = ->  
  numberOfTasks++
  $('.tasks').append("<div id='TaskTextField" + numberOfTasks + "' class='input-group'><span class='input-group-addon'>Nome" +
  "</span><input type='text' id='taskname" + numberOfTasks + "' name='tasks[" + (numberOfTasks - 1) + "][name]' class='form-control' placeholder='Insira o nome da tarefa'></div>") 

person Raphael    schedule 12.01.2014    source источник


Ответы (2)


У вас почти получилось... ваша форма возвращает хэш params, который включает, среди прочих параметров:

"tasks"=>{"0"=>{"name"=>"2e2ev"}} 

но то, что вы должны вернуть, это

"tasks_attributes"=>{"0"=>{"name"=>"2e2ev"}}

так что вы, вероятно, сразу увидите, где изменить свой javascript, чтобы построить правильно отформатированный хеш параметров. Атрибут «имя» поля ввода должен быть фиксированным.

person Les Nightingill    schedule 03.05.2014

Вы не обновляете @project своими параметрами перед его сохранением, поэтому он просто сохраняет новый экземпляр, созданный вами в new. Как только вы решите это, я думаю, вы также должны разрешить вложенные атрибуты, как описано в http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html.

person Peter Alfvin    schedule 12.01.2014
comment
Я сделал это и до сих пор не получаю вложенных атрибутов внутри моей базы данных, только проекты. - person Raphael; 12.01.2014
comment
Можете ли вы обновить свой код, чтобы отразить новую версию create? - person Peter Alfvin; 12.01.2014
comment
Да, я уже сделал это. Теперь действие создания содержит новое и сохраненное вместе. - person Raphael; 12.01.2014
comment
Не могли бы вы также обновить определение класса Project, чтобы показать, как вы разрешили вложенные атрибуты? - person Peter Alfvin; 13.01.2014
comment
Отредактировано! Как видите, я использовал accepts_nested_attributes_for :tasks, поэтому проект может принять задачу как вложенный атрибут. - person Raphael; 13.01.2014
comment
Код, который вы разместили, выглядит нормально. Затем я бы опубликовал параметры по мере их поступления и результаты вашего project_params вызова. - person Peter Alfvin; 13.01.2014
comment
Питер, я редактировал код. Может быть, проблема в вводе, сгенерированном через javascript? Обратите внимание, что я использовал параметр имени во входном теге следующим образом: name='tasks[numberofthetask][name]'. Спасибо, что зашли так далеко, чтобы помочь в этом вопросе! - person Raphael; 13.01.2014
comment
Вы по-прежнему не показываете результаты своего вызова project_params, что должно указывать на то, что атрибуты задачи не проходят через вызов permit. Я недостаточно силен в своем HTML, чтобы найти проблему с вашим javascript, но ваши атрибуты задач проходят как хеш на верхнем уровне, а не как массив. - person Peter Alfvin; 13.01.2014
comment
Есть конкретная команда или вызов, чтобы я мог увидеть параметры проекта? - person Raphael; 13.01.2014
comment
Просто включите puts project_params в метод create. - person Peter Alfvin; 13.01.2014
comment
Именно так, как я упоминал. "tasks"=>{"0"=>"TEST!"} - person Raphael; 13.01.2014
comment
Я не понимаю, почему :name в [:name] не отфильтровал "TEST!", но после просмотра раздела 4.5.3 guides.rubyonrails.org/action_controller_overview.html, похоже, что хэш с ключом "0" подходит, но вам нужно иметь хэш для значения. То есть вам нужно {name: "TEST!"}, а не просто "TEST!". Если это не сработает, я в тупике. Кстати, я предполагаю, что puts project_params опубликовал более одного из того, что вы только что показали, и что вы поделились только "tasks" => ... частью этого. - person Peter Alfvin; 13.01.2014
comment
Извините, я больше не могу редактировать комментарий, но хэш правильно распечатывается как: "tasks"=>{"0"=>{"name"=>"TEST!"} внутри хэша запроса проекта. Я не могу понять, что мне не хватает. =с - person Raphael; 13.01.2014