Обновление вложенных форм Rails 5 без создания новых записей - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь создать вложенную форму и у меня возникают проблемы при использовании страницы редактирования ресурса.Я могу заставить новое действие работать нормально, но я нахожу, что если я пытаюсь обновить ресурс, чтобы включить новый подресурс, он не сохраняет подресурсы.

Я использую rails 5.2 и у меня есть коконустановлен для вложенных форм.

order имеет много cards

Модель заказа:

class Order < ApplicationRecord
  has_many :cards, dependent: :destroy
  accepts_nested_attributes_for :cards, allow_destroy: true
end

Модель карты:

class Card < ApplicationRecord
  belongs_to :order
end

Контроллер заказов:

class OrdersController < ApplicationController
  def index
    @orders = Order.all
  end

  def new
    @order = Order.new
    @order.cards.build
  end

  def create
    @order = Order.new(order_params)
    if @order.save
      redirect_to order_path(@order)
    else
      render 'new'
    end
  end

  def show
    @order = Order.find(params[:id])
  end

  def edit
    @order = Order.find(params[:id])
    @order.cards.build
  end

  def update
    @order = Order.find(params[:id])
    if @order.update_attributes(order_params)
      redirect_to order_path(@order)
    else
      render 'edit'
    end
  end

  def destroy
    @order = Order.find(params[:id])
    @order.destroy
    redirect_to orders_path    
  end

  private
    def order_params
      params.require(:order).permit(:title, :price, cards_attributes: [:id, :title, :price, :_destroy])
    end
end

Вид редактирования заказов:

<%= form_for @order do |f| %>
  <%= f.fields_for :cards do |card| %>
    <%= render 'card_fields', f: card %>
  <% end %>
  <%= link_to_add_association f, :cards, class: "add-cards" do %>
    <span>Add Card</span>
  <% end %>
  <%= f.submit "Update" %>
<% end %>

Частичный вид заказов:

<div class="nested-fields">
  <%= f.label :title, 'Card Description', class: "g-mb-10" %>
  <%= f.text_field :title, class: "form-control form-control-md g-brd-gray-light-v7 g-brd-lightblue-v3--focus g-rounded-4 g-px-20 g-py-12" %>
  <%= link_to_remove_association f, class: "remove-quals u-link-v5 d-flex align-items-center g-color-lightblue-v3 g-ml-30" do %>
    <span class="g-ml-15">Remove Card</span>
  <% end %>
</div>

Теперь, если я добавлю @order.cards.build к edit действие работает, но если новая карта не добавлена, она все равно создает пустую запись.Также, если я изменю accepts_nested_attributes_for :cards, allow_destroy: true на accepts_nested_attributes_for :cards, allow_destroy: true, reject_if: proc { |attributes| attributes['price'].blank? }

Это работает, если ни один из других элементов не обновляется одновременно.

В идеале, когда кто-то идет на редактирование заказановая карта не должна быть видна до тех пор, пока кто-то не нажмет кнопку добавить карту.

Любая помощь будет очень полезна.

Спасибо

1 Ответ

0 голосов
/ 05 февраля 2019

обнаружил мою проблему.

Редактировать представление (добавить div с id карточек)

<%= form_for @order do |f| %>

  <div id="cards">

  <%= f.fields_for :cards do |card| %>
    <%= render 'card_fields', f: card %>
  <% end %>
  <%= link_to_add_association f, :cards, class: "add-cards" do %>
    <span>Add Card</span>
  <% end %>

  </div>

  <%= f.submit "Update" %>
<% end %>

и в моем контроллере удалил @order.cards.build из действия редактирования.

Причиной для div является то, что JS вставлял поля за пределы фактической формы.

...