Как выбрать поле модели для представления отношения многие-к-одному на активной панели администратора? - PullRequest
0 голосов
/ 22 февраля 2020

Я создаю веб-сайт электронной коммерции, используя rails 5 и activeadmin gem, чтобы управлять моей приборной панелью. У меня есть продукт и модель категории в отношениях много-к-одному.

class Product < ApplicationRecord
    before_destroy :not_referenced_by_any_line_item
    belongs_to :category
    has_many :line_items, dependent: :destroy
    has_many :reviews, dependent: :destroy

    def self.search(search)
        all.where("lower(title) LIKE :search", search: "%#{search}%")
    end 

    private

    def not_referenced_by_any_line_item
        unless line_items.empty?
            errors.add(:base, "line items present")
            throw :abort
        end
    end
end
class Category < ApplicationRecord
    has_many :products, dependent: :destroy

    def self.search(search)
        all.where("lower(category_name) LIKE :search", search: "%#{search}%")
    end 
end

Затем я зарегистрировал модели на панели управления activeadmin, как показано ниже

ActiveAdmin.register Product do

  permit_params :title, :description, :availability, 
  :price, :photo_link, :category_id, :advert, :pictureOne, 
  :pictureTwo, :pictureThree

end

ActiveAdmin.register Category do

  permit_params :category_name, :photos

end

Теперь я могу выберите категорию продукта в форме проекта при создании продукта, но проблема заключается в том, что вместо имени категории или любого другого поля, отображаемого в поле ввода формы категории проекта, чтобы вы точно знали, какую категорию вы выбираете, возникает проблема затрудняется узнать, какую категорию вы выбираете. отображение выпадающего поля формы ввода категории продукта: enter image description here

1 Ответ

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

Функциональность ActiveAdmin по умолчанию заключается в поиске поля name в данной модели при принятии решения о том, что отображать в качестве идентификатора записи. Если модель не имеет поля name, ActiveAdmin не может как-либо разрешить вам, с какой записью вы имеете дело, кроме возможности показать вам строковый беспорядок в месте, где эта запись находится в памяти (это та же строка, которую вы получили бы, если бы вы сделали Category.first.to_s в консоли).

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

Вы добавите в форму все поля, которые хотите редактировать. Когда вы добавляете ввод для категории, вы указываете, что хотите, чтобы это поле было выбором, и вы можете настроить метку выбора, например так:

# app/admin/product.rb

ActiveAdmin.register Product do
  permit_params :title, :description, :availability, 
  :price, :photo_link, :category_id, :advert, :pictureOne, 
  :pictureTwo, :pictureThree

  form do |f|
    f.inputs do
      # Add a form input for the category
      #
      # This approach also allows you to specify which categories you 
      # allow to be selected, in the "collection" attribute.
      #
      # Inside the "map" call, you have the proc return an array with the first item 
      # in the array being the name of the category (the label for the select) 
      # and the second item being the category's ID (the select's value)
      f.input :category_id, label: 'Category', as: :select, collection: Category.all.map{ |c| [c.category_name, c.id]}

      # Then add other inputs
      f.input :title
      f.input :description
      f.input :availability

      # ...
      # (Add f.input for the rest of your fields)
    end

    f.actions
  end
end

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

Если это не так уж и сложно, вам, вероятно, будет лучше переименовать category_name в вашей модели категории в name. Таким образом, вы будете бороться с ActiveAdmin намного меньше, и вам не нужно будет делать подобные настройки.

...