У меня возникла проблема с отсутствующими экземплярами и ошибками nilClass при вызове моих маршрутов. После изучения источника, кажется, что вызов generate_method в основном создает новый метод, используя блок исходного метода.
get "/" do
@some_local_instance.do_something()
end
Таким образом, в вышеприведенном методе вполне может быть локальная переменная внутри этого класса, называемая some_local_instance, однако, когда rote фактически вычисляется, у нее нет контекста относительно того, где был определен метод, поэтому он потерпит неудачу.
Причина, по которой я спрашиваю, состоит в том, что как часть моего скрипта у меня есть внешние классы, которые загружаются при загрузке Sinatra, которые регистрируют маршруты, и когда эти маршруты вызываются, мне нужно получить доступ к некоторым локальным переменным в этих классах. Примером может быть:
class SomeRouteClass
def initialize(sinatra, calculator)
@calculator = calculator
@sinatra = sinatra
end
def setup_routes
@sinatra.get "/add" do
return @calculator.add(1,1)
end
end
end
class Calculator
def add(a,b)
return a+b;
end
end
sinatra = Sinatra.new
calculator = Calculator.new
routing_class = SomeRouteClass.new(sinatra, calculator)
routing_class.setup_routes
sinatra.run!
Простите за любые орфографические / синтаксические ошибки, это всего лишь быстрый пример, но, как вы можете видеть, класс регистрирует маршруты, и когда этот маршрут ударил, возвращает некоторое значение, сгенерированное экземпляром калькулятора, который он принял при создании его экземпляра.
Проблема, с которой я столкнулся, заключается в том, что в этом примере, когда я пытаюсь запустить маршрут / add, он говорит мне, что @calculator - это nilClass, и я полагаю, что это сводится к тому, что Sinatra просто берет блок кода без контекста. , Это кажется подходящим для любого простого рендеринга шаблонов, но если вам нужно сделать что-то более причудливое или вы хотите, чтобы ваш код был модульным, без использования статики и одиночных кодов, у вас, похоже, нет никакого способа обойти это ...
Мои предположения верны здесь? и если да, то есть ли какой-либо способ сохранить контекст, так как мне кажется, что это заставляет меня писать плохой и сложный в обслуживании код, если мне приходится писать все как статические и одиночные, чтобы взаимодействовать по маршруту.
== Редактировать ==
Перестроил вопрос и содержание, чтобы более точно отразить реальную проблему, теперь, когда у меня есть более четкое понимание библиотеки.