Я пытаюсь получить представление вложенной формы для правильного обновления. Это, однако, вызывает проблемы, когда вторая форма имеет существующие данные.
Я использую accepts_nested_attributes_for и nested_form_for. Второе, единственная цель которого - динамически добавлять элемент формы, используя js. Смотрите GitHub для более
Я получаю ошибку:
Couldn't find Muscle with ID=3685340 for Exercise with ID=212831413
Я пытался выполнить обновление вручную, но мой код на самом деле не работал, и у меня сложилось впечатление, что он не нужен, поскольку rails должен позаботиться об этом под капотом.
Идея состоит в том, что: в упражнениях много мышц через мишени
И из формы Упражнения я хочу добавить целевые мышцы.
Мои модели:
class Exercise < ActiveRecord::Base
has_many :targets, :dependent => :destroy
has_many :muscles, :through => :targets
accepts_nested_attributes_for :muscles, :reject_if => :all_blank
...
end
class Target < ActiveRecord::Base
belongs_to :exercise
accepts_nested_attributes_for :exercise, :update_only => true
belongs_to :muscle
end
class Muscle < ActiveRecord::Base
has_many :targets, :dependent => :destroy
has_many :exercises, :through => :targets
end
Мой (хамл) просмотр:
%p
%b Target(s):
= f.fields_for :muscles do |e|
= e.collection_select :id, Muscle.all, :id, :name
= e.link_to_remove "-remove"
= f.link_to_add "Add target muscle", :muscles
И, наконец, мой неисправный контроллер:
def update
@exercise = Exercise.find(params[:id])
@exercise.user = current_user
params[:exercise][:muscles_attributes].each { |id, muscle|
target = Target.where(:exercise_id => @exercise.id , :muscle_id => muscle[:id]).first
if target && !(muscle[:_destroy] == "false")
puts "!!>>>>>>>>>>>>>>>>>>destroy target #{target.exercise_id} #{target.muscle_id}"
target.destroy
else
if !target
t = @exercise.targets.build(:muscle_id => muscle[:id])
t.save
end
end
}
respond_to do |format|
if @exercise.update_attributes(params[:exercise])
format.html { redirect_to(@exercise, :notice => 'Exercise was successfully updated.') }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @exercise.errors, :status => :unprocessable_entity }
end
end
end
Пожалуйста, дайте мне знать, если я должен предоставить больше моего кода (конечный результат будет в любом случае с открытым исходным кодом), я радостно подтолкну к github или что бы то ни было, заранее спасибо.