Rails: динамически удаляет вложенный объект формы

У меня есть форма для добавления вложенных объектов, например:

Это основная форма:

#purchasing_goals.html.erb
<%= f.fields_for :group_goals do |builder| %>
    <%= render partial: 'group_goal_fields', locals: { f: builder } %>
<% end %>
<div>
<%= link_to_add_fields("Add", f, :group_goals) %>
</div>

и это вложенная форма:

<div class="group-goal">
    <%= f.text_field :num_of_users, label: "No. Usuarios" %>
    <%= f.text_field :discount_percentage, label: "Descuento" %>
    <%= f.hidden_field(:_destroy) %>
    <%= link_to_remove_fields("Delete", f, "'.group-goal'") %>
</div>

и это помощники для добавления и удаления элементов group_goals:

def link_to_remove_fields(name, f, removal_class)
     link_to name, "javascript:void(0);", onclick: "remove_fields(this, #{removal_class})"
    end

    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(name, "javascript:void(0);", onclick: "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")
    end

Он отлично работает, он добавляет новый элемент, когда вы нажимаете кнопку "Добавить", однако, когда я нажимаю кнопку "Удалить", он удаляет элемент в форме, но не в параметрах формы, поэтому, когда я нажимаю кнопку отправки пустой вложенный объект отправляется в контроллер. Как сделать так, чтобы кнопка удаления удаляла элемент не только в форме (визуально), но и удаляла созданный объект?

заранее спасибо

2 ответа

Решение

Вы должны использовать следующее:

<% content_tag :div, class: "group-goal", id: f.options[:child_index] do %>
    <%= f.text_field :num_of_users, label: "No. Usuarios" %>
    <%= f.text_field :discount_percentage, label: "Descuento" %>
    <%= f.hidden_field(:_destroy) %>
    <%= link_to "Remove", "#", class: "remove", %>
<% end %>

Это позволит вам использовать следующее:

#app/assets/javascripts/application.js
$(".group_goal a.remove").on("click", function(e){
   $(this).parents(".group_goal").remove();
});

Вы должны помнить, что "динамический" fields_for элементы являются просто элементами поля HTML, и, следовательно, могут быть удалены из DOM с помощью javascript/jquery.


Вы используете старый способ Railscast для достижения этого (те, link_to_add_fields вспомогательные методы устарели).

Типичным способом достижения этого является использование Cocoon gem, или сделать это вручную, используя такие ответы: Rails accepts_nested_attributes_for с f.fields_for и AJAX

Я гость, вы должны сделать несколько шагов, чтобы исправить это. Проверьте ваш сильный параметр в вашем контроллере и добавьте _destroy а также id

def hotel_params
  params.require(:purchasing_goal).permit(:your_own_field, group_goals_attributes: [ :id, :num_of_users, :discount_percentage, :_destroy ])
end

Далее проверьте ваш purchasing_goal.rb модель для добавления allow_destroy: true

accepts_nested_attributes_for :group_goals,
                                reject_if: proc { |attributes| attributes['num_of_users'].blank? },
                                allow_destroy: true

Я надеюсь, что это поможет вам. Для получения дополнительной информации nested_forms-rails-4.2

Другие вопросы по тегам