У меня возникла проблема с отсутствующими экземплярами и ошибками nilClass при вызове моих маршрутов. После изучения источника кажется, что вызов generate_method в основном создает новый метод, используя блок исходного метода.
get "/" do
@some_local_instance.do_something()
end
Таким образом, в вышеупомянутом методе вполне может быть локальная переменная в этом классе, называемая some_local_instance, однако, когда алгоритм фактически оценивается, у него нет контекста относительно того, где был определен метод, поэтому он завершится ошибкой.
Причина, по которой я спрашиваю, заключается в том, что как часть моего сценария у меня есть внешние классы, которые загружаются при загрузке 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, и я считаю, что это связано с тем, что Синатра просто берет блок кода без контекста. .Это кажется прекрасным для любого простого рендеринга шаблонов, но если вам нужно сделать что-то более интересное или вы хотите сохранить модульность кода, не используя статику и синглтоны, у вас, похоже, нет никакого способа обойти это ...
предположения правильные здесь? и если да, то есть ли способ сохранить контекст, поскольку мне кажется, что он заставляет меня писать плохой и сложный для поддержки код, если мне нужно писать все как статику и одиночки для взаимодействия с маршрутом.
== Edit ==
Изменили структуру вопроса и содержания, чтобы более точно отразить реальную проблему, теперь, когда у меня есть более четкое представление о библиотеке.