Für mein Blogsystem habe ich natürlich auch eine Möglichkeit vorgesehen, das Design zu wechseln. Dafür werden die Konfigurationsvariablen :views und :public_folder zum neuen Design umgebogen. Früher änderte das in der Datenbank die "design"-Option und rief danach einfach diese - außerhalb der helper definierte - Funktion auf, die auch beim Start von Sinatra ausgeführt wird:
def loadConfiguration()
design = Database.new.getOption("design")
set(:design_root) { File.join(File.dirname(app_file), "designs") }
set(:views) { File.join(design_root, design) }
set(:public_folder) { File.join(views, 'public') }
end
Das funktioniert mit der neuen Sinatra-Version nicht mehr. Die Funktion funktionierte nur noch, wenn sie zu Beginn im configure aufgerufen wird - aber später, wenn sie in einer Route (post /setOption
) aufgerufen wird, findet Sinatra die set-Funktion nicht mehr:
#<NoMethodError: undefined method `set' for #<Sinatra::Application>
Da wurde wohl der Scope verändert - später, beim Befolgen der Route, ist man im Sinatra::Application-Objekt, beim Start jedoch in main. Entweder war das früher anders, oder die set-Funktion wurde früher dem Sinatra::Application-Objekt mitgegeben
Lösung für mich war, beim Start direkt den Code mit set auszuführen, später jedoch mit dem settings-Objekt zu arbeiten:
def loadConfiguration()
design = Database.new.getOption("design")
settings.design_root = File.join(File.dirname(settings.app_file), "designs")
settings.views = File.join(settings.design_root, design)
settings.public_folder = File.join(settings.views, 'public')
end
configure do
design = Database.new.getOption("design")
set(:design_root) { File.join(File.dirname(app_file), "designs") }
set(:views) { File.join(design_root, design) }
set(:public_folder) { File.join(views, 'public') }
end