Я использую версию madebydna гема nyanted_form Райана Бейтса из GitHub (можно найти по адресу https://github.com/madebydna/nested_form). Я использую раздвоенную версию для поддержки jQuery, а не Prototype.
ОБНОВЛЕНИЕ: проверьте нижнюю часть страницы для обновления этого вопроса.
РЕДАКТИРОВАТЬ:
Я использую: RoR v3.0.5, jQuery v1.4.3, Ruby v1.9.2
END EDIT
EDIT: Похоже, что текущая структура параметра pictures_attributes, передаваемого на сервер, вызывает проблему, по крайней мере из того, что я видел на других веб-сайтах.следующим образом:
"pictures_attributes"=>{"0"=>{"_destroy"=>"1", "id"=>"5"}}
На всех других сайтах, которые я видел, ошибка pictures_attributes имела следующую структуру:
"pictures_attributes"=>[{"_destroy"=>"1", "id"=>"5"}]
Я не уверен, как изменить свой код, чтобы сделать еготак что происходит последнее, а не первое. Мысли?
END EDIT
Я следовал инструкциям к T, ссылка add отлично подходит для добавления вложенных моделей, но удалить не удается. Другими словамиЯ могу добавить несколько полей дляконкретной модели, и эти модели создаются и сохраняются при отправке формы, но когда я снова собираюсь отредактировать ту же запись и удалить вложенные модели, которые я только что создал, они не удаляются из связанной записи.
Вот скрипт nested_form.js, который генерируется после установки гема nested_form.Простите, но я создал Pastie и уменьшил его: http://bit.ly/ge5BO7
Вот соответствующий код модели:
has_many :pictures, :as => :imageable, :dependent => :destroy
accepts_nested_attributes_for :pictures, :allow_destroy => true, :reject_if => lambda { |a| a[:photo].blank? }
Вот код представления (в части _form.html.erb):
<div id="picture_fields">
<% f.fields_for :pictures do |pics| %>
<div class="field">
<%= pics.label :photo, "Photo" %>
<%= pics.file_field :photo %>
<%= pics.link_to_remove "Remove Photo" %>
</div>
<% end %>
<p>
<%= f.link_to_add "Add Photo", :pictures %>
</p>
Вот сгенерированный HTML для одного поля:
<div class="fields">
<div class="field">
<label for="equipment_pictures_attributes_0_photo">Photo</label>
<input id="equipment_pictures_attributes_0_photo" name="equipment[pictures_attributes][0][photo]" type="file">
<input id="equipment_pictures_attributes_0__destroy" name="equipment[pictures_attributes][0][_destroy]" type="hidden" value="false">
<a href="javascript:void(0)" class="remove_nested_fields">Remove Photo</a>
</div>
<input id="equipment_pictures_attributes_0_id" name="equipment[pictures_attributes][0][id]" type="hidden" value="5">
</div>
А вот запись журнала, которая генерируется при отправке формы:
Started POST "/equipment/494882120" for <ipadd deleted> at 2011-03-24 13:04:18 -0400
Processing by EquipmentController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"98/R6EYCAFd6HwBjMV6bhnfRo6cT7NqPZ9fJ/VEOKKE=", "equipment"=>{"location_id"=>"", "model"=>"fasdf", "serial_number"=>"", "unh_id"=>"", "doc_id"=>"", "purchase_price"=>"", "date_acquired(1i)"=>"2011", "date_acquired(2i)"=>"3", "date_acquired(3i)"=>"24", "comment"=>"", "vendor_id"=>"", "new_vendor_name"=>"", "department_id"=>"320903175", "new_department_name"=>"", "activity_id"=>"", "new_activity_code"=>"", "condition_id"=>"746868371", "new_condition_name"=>"", "pictures_attributes"=>{"0"=>{"_destroy"=>"1", "id"=>"5"}}}, "commit"=>"Update Equipment", "id"=>"494882120"}
Equipment Load (0.7ms) SELECT "equipment".* FROM "equipment" WHERE "equipment"."id" = 494882120 LIMIT 1
Picture Load (0.4ms) SELECT "pictures".* FROM "pictures" WHERE "pictures"."id" IN (5) AND ("pictures".imageable_id = 494882120 AND "pictures".imageable_type = 'Equipment')
DEPRECATION WARNING: Overwriting validate in your models has been deprecated, please use Base#validate :method_name instead. (called from block in update at /opt/intranet3-dev/app/controllers/equipment_controller.rb:63)
Department Load (0.1ms) SELECT "departments".* FROM "departments" WHERE "departments"."id" = 320903175 LIMIT 1
Condition Load (0.1ms) SELECT "conditions".* FROM "conditions" WHERE "conditions"."id" = 746868371 LIMIT 1
сейчасНасколько я понимаю, я покрываю все свои базы, позволяя уничтожать вложенные объекты, когда _destroy => '1' встречается в переданных параметрах.Однако объект явно не разрушается.Есть ли ошибка в том, как параметры передаются на сервер?
Надеюсь, у кого-то более острый взгляд, чем я увижу какую-то явную ошибку.Помогите!
ОБНОВЛЕНИЕ:
Хорошо, мне удалось решить проблему, убрав предложение: reject_if из моего оператора acceptpts_nested_attributes_for.Это крайний случай, если у вас есть форма для загрузки файла, и я осмелюсь назвать это ошибкой.
В моем случае я смог прикрепить фотографии к моей модели Оборудования, и при редактировании он отображалсоздать такую форму, чтобы поле файла было пустым (что и должно происходить) для каждой фотографии, прикрепленной к моей записи.Потратив несколько часов на эту штуку, я подумал, что из-за предложения: reject_if действие контроллера полностью игнорирует вложенную запись, даже если я сказал ей уничтожить запись.Что ж, это так.
Если у вас есть предложение: reject_if в сочетании с: allow_destroy => true, и если: reject_if имеет значение true, ВАША ЗАПИСЬ НЕ БУДЕТ УНИЧТОЖЕНА, Неважно, что
В настоящее время я пытаюсь взломать метод для сохранения моей функциональности: reject_if.
Cheers, Les.