#ruby-on-rails #actiontext #administrate
Вопрос:
Я пытаюсь настроить текст действий внутри панели администрирования. Я следовал инструкциям по установке на странице Обзора направляющих направляющих Rails. Затем при попытке добавить атрибут в /приложение/панели мониторинга/lesson_dashboard.rb я получаю ошибки.
Когда я пытаюсь body: Field::RichText
, я получаю: uninitialized constant Administrate::Field::RichText
Когда я пытаюсь body: ActionText::RichText
, я получаю: wrong number of arguments (given 4, expected 0..1)
.
Когда я следую инструкциям в Вики-администрировании, я получаю undefined method 'body'
, когда он доходит до строки С. <%= f.rich_text_area field.attribute %>
Есть идеи, как называется этот атрибут или почему я получаю эти ошибки?
приложение/панели мониторинга/lesson_dashboard.rb:
require "administrate/base_dashboard"
class LessonDashboard < Administrate::BaseDashboard
# ATTRIBUTE_TYPES
# a hash that describes the type of each of the model's fields.
#
# Each different type represents an Administrate::Field object,
# which determines how the attribute is displayed
# on pages throughout the dashboard.
ATTRIBUTE_TYPES = {
course: Field::BelongsTo,
documents: Field::ActiveStorage.with_options(
show_display_preview: false,
destroy_url: proc do |namespace, resource, document|
[:delete_document_course, resource, { document_id: document.id }]
end
),
id: Field::Number,
title: Field::String,
# body: Field::Text,
body: RichTextAreaField,
created_at: Field::DateTime,
updated_at: Field::DateTime,
}.freeze
# COLLECTION_ATTRIBUTES
# an array of attributes that will be displayed on the model's index page.
#
# By default, it's limited to four items to reduce clutter on index pages.
# Feel free to add, remove, or rearrange items.
COLLECTION_ATTRIBUTES = %i[
title
course
].freeze
# SHOW_PAGE_ATTRIBUTES
# an array of attributes that will be displayed on the model's show page.
SHOW_PAGE_ATTRIBUTES = %i[
course
title
body
documents
created_at
updated_at
].freeze
# FORM_ATTRIBUTES
# an array of attributes that will be displayed
# on the model's form (`new` and `edit`) pages.
FORM_ATTRIBUTES = %i[
course
title
body
documents
].freeze
# COLLECTION_FILTERS
# a hash that defines filters that can be used while searching via the search
# field of the dashboard.
#
# For example to add an option to search for open resources by typing "open:"
# in the search field:
#
# COLLECTION_FILTERS = {
# open: ->(resources) { resources.where(open: true) }
# }.freeze
COLLECTION_FILTERS = {}.freeze
# Overwrite this method to customize how lessons are displayed
# across all pages of the admin dashboard.
def display_resource(lesson)
lesson.title
end
# permitted for has_many_attached
def permitted_attributes
# super [:attachments => []]
super [:documents => []]
end
end
приложение/модели/урок.rb:
class Lesson < ApplicationRecord
belongs_to :course
has_many_attached :documents
validates :title, presence: true
end
Комментарии:
1. Я не являюсь администратором, но некоторые случайные поисковые запросы указывают на то, что вам нужно создать свой собственный тип поля для поддержки расширенного текста / ActionText. Помогает ли это вообще?
2. Я этого не нашел, спасибо за ссылку. Но следование ему только приводило меня к разным ошибкам. Я обновил вопрос.
3. Не могли бы вы отредактировать свой вопрос, чтобы добавить код
lesson_dashboard.rb
иLesson
модель? Просто для развлечения я создал проект scratch Rails и прошел через руководство по ActionText и администрированию, и это сработало для меня.4. Я добавил код. Каким руководством вы пользовались?
Ответ №1:
В руководстве ActionText и справке по администрированию есть информация, но она несколько разрознена на нескольких страницах, поэтому я набросал шаги, которые я использовал в новом приложении Rails 6.1.
Эти шаги предполагают, что вы настроили ActionText (запустите rails g action_text:install
и запустите результирующие миграции) и установили/настроили administrate
gem.
- Для редактора расширенного текста Trix требуется Javascript, который в Rails 6 загружается с webpack. Макет администрирования по умолчанию не подходит для веб-пакетов, поэтому вам необходимо настроить макет. Создание макетов для настройки:
% rails generate administrate:views:layout
- Добавьте a
javascript_pack_tag
views/layouts/admin/application.html.erb
, чтобы загрузить пакет приложений:
<head>
...
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
<%= render "stylesheet" %>
<%= csrf_meta_tags %>
...
</head>
В руководстве по администрированию вы создадите отдельный пакет для администрирования JS, но он требуется только в том случае, если вам нужно настроить JS (например, для использования flatpickr
в качестве средства выбора даты). Для простого использования RichText это не требуется, поэтому мы просто загружаем основной пакет приложений.
- Вам также необходимо настроить администрирование CSS для добавления стилей Trix. Запустите задачу для создания пользовательских таблиц стилей администрирования:
% rails generate administrate:assets:stylesheets
- Редактировать администрировать таблицы стилей, чтобы включить стили для элементов управления Trix rich text внизу:
// Rest of file
...
@import "trix/dist/trix";
@import "selectize";
.trix-content {
.attachment-gallery {
> action-text-attachment,
> .attachment {
flex: 1 0 33%;
padding: 0 0.5em;
max-width: 33%;
}
amp;.attachment-gallery--2,
amp;.attachment-gallery--4 {
> action-text-attachment,
> .attachment {
flex-basis: 50%;
max-width: 50%;
}
}
}
action-text-attachment {
.attachment {
padding: 0 !important;
max-width: 100% !important;
}
}
}
.field-unit--rich-text-area-field {
.field-unit__field {
width: 80%;
}
}
- Добавьте пользовательский тип поля для редактирования форматированного текста, так как Administrate не включает поле «из коробки».
% rails g administrate:field rich_text_area
- Измените тип поля ввода,
fields/rich_text_area/_form.html.erb
чтобы использовать элемент управления форматированным текстом Trix:
<div class="field-unit__field">
<%= f.rich_text_area field.attribute %>
</div>
- Отредактируйте свою модель, чтобы добавить атрибут форматированного текста:
class Lesson < ApplicationRecord
has_rich_text :body
end
- Создайте панель мониторинга для своей модели:
% rails generate administrate:dashboard Lesson
- Измените тип поля
dashboards/lesson_dashboard.rb
, чтобы использовать пользовательский тип поля:
ATTRIBUTE_TYPES = {
...
rich_text_body: RichTextAreaField,
}.freeze
Комментарии:
1. Я отметил это как правильный ответ, поскольку он решает проблему, которую я задал …но содержание тела, которое было на существующих уроках, не отображается. Я могу сохранить новое содержимое тела, поэтому я знаю, что оно работает, но как я могу поместить все старое содержимое в тело редактора Trix? Возможно, стоит добавить к ответу для потомков. В любом случае, спасибо за твою помощь, Роб.
2. Возможно, у вас изначально был
body
атрибут непосредственно наLesson
модели? ActionText хранитhas_rich_text
большие двоичные объекты в отдельной таблице. Ничто не мешает вашей модели иметь атрибут с тем же именем, что и у вашего большого двоичного объекта, но ActionText переопределяет метод доступа. Если это ваша ситуация, вы, вероятно, можете просто загрузить значение атрибута старой модели и повторно сохранить его (или написать миграцию для этого).