Масса назначить коллекцию существующих записей рельсов - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь присвоить коллекцию существующих записей существующей (или новой) связанной записи.

Например:

class List < ApplicationRecord
    has_and_belongs_to_many :items, join_table: :list_items
    accepts_nested_attributes_for :items
end
class Item < ApplicationRecord
    has_and_belongs_to_many :lists, join_table: :list_items
end

На мой взгляд для форм создания или редактирования списка, я отправляю: name, а также: items_attributes с: id для каждой записи I хочу связать с моим списком.

В моем контроллере списков я делаю:

def update
    items = Item.where(id: list_params[:items_attributes][:id])
    @list.items = items

    respond_to do |format|
// the following line breaks, because @list currently has no "item" (the
// association built previously hasn't been saved yet) 
      if @list.update(list_params)
        format.html { redirect_to @list, notice: 'List was successfully updated.' }
        format.json { render :show, status: :ok, location: @list }
      else
        format.html { render :edit }
        format.json { render json: @list.errors, status: :unprocessable_entity }
      end
    end
  end

Однако я получаю

ActiveRecord::RecordNotFound in ListsController#update

Couldn't find Item with ID=1 for List with ID=1

Как мне go сохранить эту ассоциацию в " Рельсы "кстати?

РЕДАКТИРОВАТЬ

list_params будет примерно так (с использованием драгоценного камня Cocoon):

{"name"=>"Standard location shoot", "items_attributes"=><ActionController::Parameters {"1582459909419"=><ActionController::Parameters {"id"=>"1"} permitted: true>} permitted: true>}

Нефильтрованные параметры: {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"qkXKM9U/1+Y8T4RttvPg==", "list"=>{"name"=>"Standard location shoot", "items_attributes"=>{"1582459152520"=>{"id"=>"1", "_destroy"=>"false"}}}, "commit"=>"Update List", "controller"=>"lists", "action"=>"update", "id"=>"1"}

И в более общем смысле определение для list_params:

# Never trust parameters from the scary internet, only allow the white list through.
    def list_params
      params.fetch(:list, {}).permit(:name, items_attributes: [:id])
    end

1 Ответ

0 голосов
/ 24 февраля 2020

@list.items = items означает, что в списке много элементов, а в таблице элементов есть столбец list_id.

Вы можете попробовать @list.update item_ids: list_params[:items_attributes][:id]

...