Skip to content

Instantly share code, notes, and snippets.

@a-x-
Forked from hrom512/dsl.rb
Last active October 31, 2019 09:00
Show Gist options
  • Save a-x-/f9a07ad9c7860717701c8e6220f12037 to your computer and use it in GitHub Desktop.
Save a-x-/f9a07ad9c7860717701c8e6220f12037 to your computer and use it in GitHub Desktop.
mini Re:activeAdmin pseudo code
# DSL-хелперы для конечного контроллера, действуют в контексте класса-контролера, не в инстансе и не в базовом классе
# Записывают в instance_variables класса конечного контроллера данные, переданные DSL-вызовами
module DslHelpers
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def actions
@actions ||= []
end
def action_item(sym, **options, &block)
# Внутри блока action_item обычно находятся link_to, button_to DSL-хелперы
# Здесь задаётся контекст блока для формирования JSON'а вида: [{type: 'link', path: '..', title: '..'},,,]
create_actions = proc { run_dsl self, JsonViewHelpers::Actions, &block }
# Все сформированные DSL-методами данные складываются в instance_variables класса контроллера
# Кроме того, на этом этапе могут регистрироваться роуты и пункты меню (но скорее всего, пока еще нет)
actions << { id: sym, block: create_actions, options: options }
end
end
end
# InheritedResources — используется и в ActiveAdmin, дает collection, resource и хелперы
class ReactiveAdmin::Base < InheritedResources::Base
include AdminHelper # Общие с felix-rails контроллерами хелперы
include Admin::AuthControllerHelper # Такая же авторизация как в felix-rails
include JsonViewHelpers # table_for, button_to,,,
include DslHelpers # in class context
# rails handle
def show
{ resource: resource, meta: { action_items: self.class.action_items } }
# На практике полученные от DSL-методов данные еще пред-подготавливаются
# А сам ответ resource или collection может быть получен из 3-х разных мест:
# .json.rabl | .arb | dsl-хелперы в контроллере
end
end
class Admin::PackageBagsController < ReactiveAdmin::Base
object Package::Bag
actions :show
action_item :nahuy, only: :show do
link_to 'Нахуй', nahuy_admin_hui_path
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment