Использование 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'
Другие вопросы по тегам