Как мне применить метапрограммирование для упрощения моих контроллеров? - PullRequest
0 голосов
/ 21 марта 2012

В моем widgets_controller.rb у меня есть следующий метод

# GET /widgets/index_of_deleted
def index_of_deleted
  @widgets = Widget.order("name").deleted

  respond_to do |format|
    format.html
  end
end

И у меня есть много других моделей, которые будут использовать этот метод.Как я могу создать модуль, который имеет этот метод в общей форме, чтобы я мог СУШИТЬ свои контроллеры?Я думаю, что решение было бы вызвать это ..

index_of_deleted("widget")

.. в моем widgets_controller.rb.Или, может быть, я могу использовать имя контроллера и просто включить этот модуль в каждый контроллер, который будет использовать этот метод?

В частности, как будет выглядеть реализация index_of_deleted в моем модуле?

1 Ответ

2 голосов
/ 21 марта 2012

Вы можете писать модули и включать их. Начните с создания файла в lib, может быть, так:

module WidgetExtras
  def index_of_deleted(widget)
    # implementation
  end
end

Затем в вашем WidgetsController рядом с вершиной просто добавьте:

include WidgetExtras

Возможно, вы захотите более явно именовать пространство ваших модулей (просто вложите их).

Редактировать

Я не уверен, что действительно стоит абстрагироваться от того, сколько моделей существует, которым нужна эта функциональность? Вместо этого вы можете написать помощника, чтобы найти удаленные элементы:

module ApplicationHelper
  def deleted_for_class( klass )
    klass.order('name').deleted
  end
end

Но тогда почему бы просто не создать область для «удаленного Model по имени» ...

Редактировать 2

Вы можете написать реализацию для установки переменной экземпляра ...

def index_of_deleted( widget_name )
  klass = Kernel.const_get(widget_name.classify)
  instance_variable_set( "@#{widget_name.pluralize}", klass.order('name').deleted )
end
...