Дочерняя запись 1-ко-многим не всегда сохранялась с родителем в рельсах 3.1.3. - PullRequest
0 голосов
/ 15 февраля 2012

В нашем приложении rails 3.1.3 есть user и user_level. У пользователя много уровней user_level, а user_level принадлежит пользователю.

Запись user_level была успешно сохранена при создании объекта user_level в 'new', как показано ниже:

  def new
    @user = User.new
    @user.user_levels.build     
  end

Однако запись user_level, добавленная со следующим кодом (by railscasts.com # 197), не была сохранена с @user:

  def link_to_add_fields(name, f, association)
    new_object = f.object.class.reflect_on_association(association).klass.new
    fields = f.simple_fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
      render :partial => association.to_s, :locals => {:f => builder, :i_id => 0} 
    end
    link_to_function(name, "add_fields(this, \"#{association}\", \"#{j fields}\")")
  end

Оба fields_for и simple_fields_for были испробованы без удачи. HTML-код для вставленного поля был сгенерирован f.simple_fields_for(association, new_object, :child_index => "new_#{association}"). Но каким-то образом добавленное поле не было сохранено вместе с @ user.save.

В успешном случае объект уровня пользователя был создан в 'new' с @user.user_levels.build. В неудачном случае объект был создан с f.object.class.reflect_on_association(association).klass.new в 'link_to_add_fields'. Мы безуспешно пытались использовать obj.user_levels.build в link_to_add_fields.

Есть мысли о проблеме? Большое спасибо.

UPDATE:

вот строка ПЛОХОЙ, отправленная на сервер, когда выбраны 2 позиции:

{"name" => «pur eng», «login» => «tester10», «password» => «password», «password_confirmation» => «password», «user_type» => «employee», "user_levels_attributes" => {"1329335776431" => {"user_levels" => {"position" => "mech_eng"}, "_destroy" => "false"}, "1329335779261" => {"user_levels" => { "position" => "elec_eng"}, "_destroy" => "false"}}}

Вот ХОРОШАЯ строка, отправленная на сервер и успешно сохранившая уровни пользователя.

{"name" => «tester eng», «login» => «tester11», «password» => «пароль», «password_confirmation» => «пароль», «user_type» => «employee», "user_levels_attributes" => {"0" => {"position" => "elec_eng"}, "1" => {"position" => "inst_eng"}}}

Вызывает ли проблема дополнительный "user_levels" => в строке BAD? Если это так, как это удалить?

1 Ответ

1 голос
/ 15 февраля 2012

Как описывает Райан в конце заметок к шоу:

Обновление: приведенный ниже код был немного изменен для работы с Rails 3.x (удаленный вызов h удален)

def link_to_add_fields(name, f, association)
    new_object = f.object.class.reflect_on_association(association).klass.new
    fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
      render(association.to_s.singularize + "_fields", :f => builder)
    end
    link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")
end
...