nested_form gem add работает, но удалить не удается ... почему? - PullRequest
4 голосов
/ 24 марта 2011

Я использую версию 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.

1 Ответ

2 голосов
/ 25 марта 2011

Проблема заключается в том, что состояние вложенной записи, когда она передается, приводит к тому, что предложение :reject_if в операторе accepts_nested_attributes_for оценивается как true, и, таким образом, контроллер пропускает ее и не выполняет над ней никаких действий.Следовательно, вложенная запись не уничтожается, поскольку над ней не выполняется никаких действий.

...