Принимает вложенные атрибуты For - edit form отображает неправильное количество элементов (+! Map: ActiveSupport:: OrderedHash {})
У меня есть профиль профиля учителя, который имеет много предметов (отдельная модель). Я хочу добавить объекты в профиль в той же форме для создания/редактирования профиля. Я использую accepts_nested_attributes, и это отлично подходит для создания. Однако на странице редактирования я получаю очень странную ошибку - вместо того, чтобы видеть 3 объекта (я добавил три при создании, и просмотр в консоли подтверждает это), я вижу 12 предметов (!).
#Profile model
class Profile < ActiveRecord::Base
has_many :subjects
accepts_nested_attributes_for :subjects
end
#Subject Model
class Subject < ActiveRecord::Base
belongs_to :profile
end
#Profile Controller (only showing deviations from normal RESTFUL setup)
def new
@profile = Profile.new
3.times do
@profile.subjects.build
end
end
#Here 1 of three parts of the subject output of = debug @profile
errors: !ruby/object:ActiveRecord::Errors
base: *id004
errors: !map:ActiveSupport::OrderedHash {}
subjects:
- &id001 !ruby/object:Subject
attributes:
exam: Either
name: "7"
created_at: 2010-04-15 10:38:13
updated_at: 2010-04-15 10:38:13
level: Either
id: "31"
profile_id: "3"
attributes_cache: {}
# Note that 3 of these attributes are displayed despite me seeing 12 subjects on screen
Дополнительная информация в случае, если это актуально.
Rails: 2.3.5, Ruby 1.8.7 p149, HAML, inherited_resources
У меня никогда не было так много проблем с ошибкой раньше - я уже потерял около 8 часов. Понравилась бы какая-нибудь помощь!
Спасибо, кто-то отважный
Джек
Ответы
Ответ 1
Оказывается, это проблема с формой редактирования. Я случайно установил блок вложенных полей как (fields_for) как вставленный ruby , а не оценил ruby .
Таким образом, вместо написания этого
- form.fields_for :subjects do |ff|
= ff.collection_select :name, Subject.all, :id, :name, :include_blank => true
= ff.select :exam, ["Either", "Leaving Cert Only"]
= ff.select :level, ["Either", "Higher Level Only"]
Я написал это:
= form.fields_for :subjects do |ff|
= ff.collection_select :name, Subject.all, :id, :name, :include_blank => true
= ff.select :exam, ["Either", "Leaving Cert Only"]
= ff.select :level, ["Either", "Higher Level Only"]