Мой вопрос касается методов контроллера (возможно, включенных из внешнего класса), которые работают с переменными экземпляра. Я часто использую before_filter в контроллерах для установки определенных переменных, например ::10000
class DocumentController < ApplicationController
before_filter :fetch_document
def action
@document.do_something
end
private
def fetch_document
@document = Document.find(params[:id])
end
end
Я работал над проектом, в котором несколько контроллеров будут использовать некоторые функции, например, редактирование документов. Моей первой мыслью было извлечь соответствующие методы и получить их из application_controller.rb или отдельного модуля. Но потом я заметил, что пишу код, который выглядит следующим образом:
def fetch_document
@document = Document.find(params[:id])
end
def do_something_to_document
@document.do_something
end
Это вызывает предупреждающие сигналы: do_something_to_document по существу предполагает существование @document, а не принимает его в качестве аргумента. Это, по вашему мнению мудреца, плохая практика кодирования? Или я параноик?
Предполагая, что это проблема, я вижу два основных подхода к ней:
Проверьте наличие экземпляра var и bail, если он не установлен:
def do_something_to_document
raise "no doc!" unless @document
[...]
end
Вызвать действие с экземпляром var в качестве аргумента:
def do_something_to_document(document)
[...]
end
2 выглядит лучше, потому что скрывает контекст вызывающего объекта. Но do_something_to_doc будет вызываться только теми контроллерами, которые уже установили @document, а принятие @document в качестве аргумента метода приводит к накладным расходам на создание объекта. (Верно?) 1 кажется хакерским, но должно охватывать все случаи.
Я склонен идти с 1 (при условии, что я прав в вопросе производительности), хотя при просмотре списка методов, ссылающихся на таинственные экземпляры vars, я получаю ульи. Мысли? Дайте мне знать, если я могу быть более ясным. (И, конечно, если на этот вопрос ответили где-то, я его не видел, просто укажи мне правильное направление ...)
Спасибо,
-Erik