Обновление вложенных форм существующими данными во внутренней форме с использованием rails 3 - PullRequest
1 голос
/ 23 марта 2011

Я пытаюсь получить представление вложенной формы для правильного обновления. Это, однако, вызывает проблемы, когда вторая форма имеет существующие данные.

Я использую 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 или что бы то ни было, заранее спасибо.

1 Ответ

0 голосов
/ 23 июля 2011

Этого можно достичь, манипулируя промежуточной таблицей, здесь targets.

Вставьте в вашу модель:

accepts_nested_attributes_for :targets

И в своем html добавьте эту строку с помощью javascript:

<input name="exercise[targets_attributes][0][muscle_id]" value="the_muscle_id_goes_here" type="hidden">
...