Когда я использую первый «form.select: category_id», который вызывает 3 раскрывающихся списка, сохраняется только последний выбранный раскрывающийся список.Если я выберу 3 отдельные категории, будет сохранена только последняя выбранная категория.Я хочу иметь возможность выбрать несколько категорий для каждого списка.
Конечно, у вас три одинаковых выпадающих списка для одного и того же атрибута , и он будетпросто выбирает выбранное значение последнего выпадающего списка и передает его в params
.
. Вам нужно установить его как один выпадающий список и разрешить множественный выбор на нем, например, так
<%= form.select :category_ids, options_from_collection_for_select(Category.all, :id, :name), :prompt => "Select a Category", :multiple => true %>
Обратите внимание на изменения :category_ids
и :multiple => true
.:category_ids
- это метод (collection_singular_ids
), который отправляет для связей многие-ко-многим , которые будут использоваться Rails под капотом для создания записей для объединенногоТаблица .
:multiple => true
позволяет выбрать более одной опции и передать эти ids
в виде массива.Например, вот так: category_ids: ["1","2","3"]
Теперь, перейдя к коду вашего контроллера, вы не должны создавать списки для категорий, поскольку ваш подход отличается.Измените свой новый метод на
def new
@listing = Listing.new
end
Также не обязательно иметь @categories = Category.all
, поскольку вы явно вызываете Category.all
в select
И, наконец, белый список category_ids
в listing_params
вот так
params.require(:listing).permit(:attr1, .... category_ids: [])
Между "~~~~~~~~~~~~~~~~~~~~~" мои попытки его протестировать,Они даже не отображаются в форме, хотя я не знаю, почему.
Ну, вы запутались с accepts_nested_attributes_for
, а также с fields_for
.Читайте дальше!
Примечание:
Также, как упомянуто @ IIya Konyukhov , ваша схема выглядит иначе для ассоциации HABTM ,Вы должны изменить свою схему так, чтобы она соответствовала потребностям вашего подхода к работе.
Обновление # 1
Я использую категории для поискачерез списки.поэтому я хочу, чтобы при создании листинга можно было выбрать несколько категорий, чтобы они соответствовали списку.и категории будут предварительно определены.
Вышеупомянутый подход должен соответствовать вашим потребностям, но в вашем коде нужно сделать больше настроек, чтобы он работал.
1) Ассоциации в Category
модели имеют недостатки.Вам нужно изменить has_many :listings
на has_and_belongs_to_many :listings
2) Удалить validates_uniqueness_of :category
из модели категории, так как она недопустима.
3) Удалить category_id
из listings
таблицы
4) Создайте объединенную таблицу HABTM для listings
и categories
, как показано ниже
rails generate migration CreateJoinTableCategoryListing category listing
Теперь после сохранения списка рельсы под колпаком будут создавать записи для categories_listings
что будет правильным для вышеупомянутого подхода.
Хотя новые могут / должны быть добавлены администраторами (а не пользователями), чтобы затем иметь возможность добавлять категорию к существующим илиновый листинг
Это также можно сделать тем же способом, что и выше, для создания нового листинга с существующими категориями.И просто отредактируйте форму редактирования списка, чтобы добавить существующую категорию для этого списка.Вам просто нужно убедиться, что эти маршруты отличаются и доступны только администраторам.
Обновление № 2:
Вам необходимо удалить свои текущие ассоциации в Listing
смоделируйте и добавьте в него следующий код.
#listing.rb
has_and_belongs_to_many :categories
А также удалите category_id
из списка параметров.Просто держи category_ids: []
params.require(:listing).permit(:attr1, :name, :description, :price, :image, category_ids: [])