Работа с отсутствием контекста в методах маршрутизации Sinatra

У меня возникла проблема с отсутствующими экземплярами и ошибками 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 ==

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

7
задан Grofit 22 November 2011 в 15:28
поделиться