У меня возникла проблема с отсутствующими экземплярами и ошибками 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, и я считаю, что это связано с тем, что Sinatra просто берет блок кода без контекста. Это кажется подходящим для любого простого рендеринга шаблонов, но если вам нужно сделать что-то более причудливое или вы хотите, чтобы ваш код был модульным, не используя статику и синглтоны, у вас, похоже, нет никакого способа обойти это...
Здесь мои предположения верны? и если да, то есть ли способ сохранить контекст, поскольку мне кажется, что он заставляет меня писать плохой и сложный в обслуживании код, если мне приходится писать все как статику и синглтоны для взаимодействия с маршрутом.
== Изменить ==
Реструктурировал вопрос и содержание, чтобы более точно отразить реальную проблему, теперь, когда у меня есть более четкое представление о библиотеке.