Как мне связать данные родословной gem в Administrate gem

#ruby-on-rails #ancestry #administrate

#ruby-on-rails #родословная #администрировать

Вопрос:

Я использую Administrate gem в своем приложении Rails 6. Я создал модель категории и использую родословную gem для организации древовидной структуры и т.д. У меня возникли проблемы при попытке интегрировать родословную gem в Administrate. В основном проблема, из-за которой parent_id для родословной gem равен нулю, поэтому и 2. попытка отобразить дочернее имя / отношения в Administrate.

  1. Gem Administrate из-за взаимосвязи не будет принимать нулевое значение при редактировании формы «родословная» добавляется в форму панели мониторинга в administrate.
  2. Другая проблема, которую я пытаюсь преодолеть, — это отображение связанного имени дочернего элемента, идентификатора, который использует ancestry. Итак, родословная использует строковое поле, которое помогает найти родительский элемент, используя идентификатор строки категории. Я понятия не имею, как управлять панелью администрирования / контроллером для отображения имени поля.

Любая помощь была бы очень признательна. Я немного погуглил это и, похоже, не могу найти ничего, связанного с той же проблемой.

Стоит ли использовать Ancestry и Administrate вместе? Или я должен просто создать свой собственный контроллер категорий и представления, чтобы позволить администратору изменять данные категории? Я бы предпочел попытаться сохранить все данные администратора в Administrate, если это возможно.

Огромное спасибо.

Комментарии:

1. В данный момент я занимаюсь этим вопросом. Я не уверен, что понимаю все на 100%. Например, когда вы говорите «равно null so и 2», я думаю, вы, возможно, что-то пропустили там? Другой аналогичный раздел — «дочернего идентификатора, который использует ancestry».

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

3. И раз уж мы взялись за это: можете ли вы поделиться примером того, что вы хотите? Набросок желаемого конечного состояния был бы очень полезен для визуализации того, чего вы хотите достичь.

4. Привет @pablobm, спасибо, что нашли время прочитать мой вопрос. Извиняюсь за поздний ответ. В настоящее время я работаю над проектом 2 дня в неделю, поэтому я включаюсь в него и выхожу из него, когда у меня есть время. Позвольте мне просмотреть мои вопросы (варианты написания и т.д.) И немного подробнее остановиться на проблеме позже. Еще раз спасибо за ваше время.

Ответ №1:

Просто добавляю свое решение ниже на случай, если кто-нибудь еще столкнется с этим вопросом.

Чтобы разрешить Administrate принимать значение null, даже если может потребоваться присутствие из-за использования отношения ancestry gem в модели. например.

 class Category < ApplicationRecord
  has_ancestry
end
  

Вы можете переопределить ‘параметры ресурса’ в контроллере администратора в Administrate.

 # Override `resource_params` if you want to transform the submitted
# data before it's persisted. For example, the following would turn all
# empty values into nil values. It uses other APIs such as `resource_class`
# and `dashboard`:

 def resource_params
   params.require(resource_class.model_name.param_key).
     permit(dashboard.permitted_attributes).
     transform_values { |value| value == "" ? nil : value }
 end
  

Часть 2.

В категории «Панель мониторинга» я хотел изменить идентификатор на описательное имя. Ancestry gem использует строковое поле для отображения идентификатора родительской категории.

Панели мониторинга > файл category_dashboard.rb

   ATTRIBUTE_TYPES = {
    ancestry: Field::Select.with_options(collection: Category.all.map do |cat| [cat.name, cat.id] end),
    #ancestry: Field::Text,
  }.freeze
  

Я сделал attriubte_type полем выбора со значением options вместо текстового поля и сопоставил имя и идентификатор.

Это позволило мне выбрать идентификаторы родительской категории, видя их имена вместо идентификаторов. Однако я не смог выбрать нулевое значение, и мне потребовалось оставить эту область выбора пустой, если я хотел, чтобы часть 1 выполнила свою задачу и сделала пустое поле = null. Превращение категории в родительскую при добавлении пользователем с правами администратора.

Вы можете сгенерировать все поля в Administrate с помощью команды generate. (Я добавлю это в комментарии, как только у меня будет возможность).

После добавления я мог редактировать формы полей выбора. Это позволило мне добавить:include_blank => ‘Основная категория’ в форму выбора поля в adminstrate.

    <% if field.selectable_options.firstamp;.is_a?(Array) %>
       <%= f.select(
         field.attribute,
         options_from_collection_for_select(
           field.selectable_options,
           :last,
           :first,
           field.data.presence,
         ),
       :include_blank => 'Primary Category'
       ) %>
  <% else %>
    <%= f.select(
      field.attribute,
      options_from_collection_for_select(
        field.selectable_options,
        :to_s,
        :to_s,
        field.data.presence,
      ),
    :include_blank => 'Primary Category'
    ) %>
  <% end %>
  

Комментарии:

1. rails генерирует administrate:views: поле all