#ruby-on-rails #ancestry #administrate
#ruby-on-rails #родословная #администрировать
Вопрос:
Я использую Administrate gem в своем приложении Rails 6. Я создал модель категории и использую родословную gem для организации древовидной структуры и т.д. У меня возникли проблемы при попытке интегрировать родословную gem в Administrate. В основном проблема, из-за которой parent_id для родословной gem равен нулю, поэтому и 2. попытка отобразить дочернее имя / отношения в Administrate.
- Gem Administrate из-за взаимосвязи не будет принимать нулевое значение при редактировании формы «родословная» добавляется в форму панели мониторинга в administrate.
- Другая проблема, которую я пытаюсь преодолеть, — это отображение связанного имени дочернего элемента, идентификатора, который использует 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