Использование Apotomo gem для создания пользовательской страницы виджета
Я пытаюсь использовать apotomo
для настройки виджетов в моем приложении и столкнулся с несколькими проблемами. Я пытался исследовать, но пока не нашел ничего полезного. Надеюсь, у кого-то здесь может быть какой-то опыт.
Вот моя установка:
- У меня есть модель Users (настроенная через Devise), каждый из которых может создавать собственные страницы (модель Pages).
- Каждая страница может иметь несколько виджетов.
PagesController#show
view используется для отображения опубликованной версии страницы или предварительного просмотра страницы для пользователя.PagesController#edit
view используется для отображения страницы в режиме "edit" с формами для каждого виджета, что позволяет пользователю обновлять их по мере необходимости. - У меня есть модель виджетов с сериализованным полем "данных", которое содержит значения для каждого виджета. (Такие вещи, как
title
,url
, так далее).
Проблема, с которой я сталкиваюсь, заключается в отображении настроенного виджета каждого пользователя.
Ради этого вопроса, давайте предположим, что у меня есть один виджет "PicturesWidget". Я добавил виджет в PagesController
вот так:
class PagesController < ApplicationController
has_widgets do |root|
root << widget(:pictures)
end
...
end
У меня есть два представления в контроллере страниц: "PagesController#Edit" и "PagesController#Show". Я также определил два вида в контроллере виджетов, один из них "PicturesWidget#edit", а по умолчанию "PicturesWidget#display". Из представлений редактирования и показа я использую что-то вроде этого для загрузки виджетов:
# In views/pages/show.html.erb:
<%= render_widget :pictures, :display, ... %>
# In views/pages/edit.html.erb:
<%= render_widget :pictures, :edit, ... %>
Однако главная проблема, с которой я сталкиваюсь, заключается в том, что у пользователя может быть несколько виджетов на страницу. Другими словами, я должен перейти в сериализованный data
поле в каждый виджет, чтобы он мог отображать содержимое в PicturesWidget#display
или же PicturesWidget#edit
Просмотры. в PagesController
Я делаю:
def show
@user = ...
@page = @user.pages.find(params[:page_id])
@widgets = @page.widgets
end
И в views/pages/show.html.erb
Я использую следующий цикл:
<% @widgets.each do |widget| %>
<%= render_widget :pictures, :display, :widget => widget %>
<% end %>
Это приводит к передаче каждого отдельного виджета ActiveRecord в качестве аргумента PicturesWidget
контроллер. В контроллере виджета я добавил "args" в оба display
а также edit
методы:
def display(args)
@widget = args[:widget]
@title = @widget.data[:title]
@url = @widget.data[:url]
render
end
Это вызывает у меня проблемы повсюду, потому что, когда мне приходится повторно визуализировать представление или заменять его другим, я обычно получаю жалобы на отсутствие аргументов "args" и не могу передать их.
В документации Apotomo я обнаружил, что мы должны использовать опции вместо аргументов в новой версии гема. Опции извлекаются из метода has_widget в оригинале PagesController
:
has_widgets do |root|
root << widget(:pictures, :data => @data)
end
В этом случае options[:data]
вернется @data
, Тем не менее, мне нужно предоставить данные для каждого виджета, а не глобальный @data
вар. Я не смог найти никаких примеров того, как это делают другие. Какие-либо предложения? Или я должен просто отказаться от всего этого и написать свой собственный контроллер виджетов? Или понизить до ячеек и написать свои собственные обработчики AJAX?
Извините за длинную рецензию. Я считаю, что кто-то еще может столкнуться с этой проблемой, и, надеюсь, это поможет им.
Спасибо ник
[Edit] Как и предполагалось, я добавил уникальные виджеты так:
@page.widgets.each do |indiv_wid|
root << widget(indiv_wid.kind.to_sym, indiv_wid.id, data: indiv_wid.data)
end
Пришлось переопределить один из модулей, чтобы разрешить использование apotomo_root в контроллере / представлениях:
module Apotomo
module Rails
module ActionViewMethods
delegate :render_widget, :apotomo_root, :url_for_event, :to => :controller
end
end
end
(Добавлено :apotomo_root
выше)
Используйте это в контроллере, чтобы получить список всех загруженных виджетов:
apotomo_root.each do |x|
@widget_ids << x.widget_id unless x.widget_id == :root
end
И тогда я просто повторил это в представлении:
<% @widget_ids.each do |id| %>
<%= render_widget id %>
<% end %>
1 ответ
Вы можете иметь отдельные параметры для виджетов. В любом случае, вы должны создавать различные виджеты для каждой конфигурации. Сделайте это, передав идентификатор каждому виджету: http://rdoc.info/github/apotonick/apotomo/Apotomo/WidgetShortcuts:widget
class PagesController < ApplicationController
has_widgets do |root|
root << widget(:pictures, 'one', :data => ...)
root << widget(:pictures, 'two', :data => ...)
end
...
end
Вы можете использовать идентификатор виджета в #render_widget
, затем.
render_widget 'one'