Sinatra marshrutni baholash, dinamik yo'nalishlar bilan bog'liq

Umid qilamanki, bu oddiy javob bo'ladi, men ruby va Sinatra uchun yangi bo'lganman.

Men modulli yondashuv yordamida sinatra dasturini yozishga qidiryapman, lekin plagin modasida yangi marshrutlarni qo'shishni xohlayman.

Hozirda Sinatra :: Base'dan egallagan SinatraApp sinfim bor, hozirda men plaginlar jildidan o'tadigan va qo'shimcha marshrutlarni o'z ichiga olgan barcha yo'naltiruvchi-definition.rb fayllarini o'z ichiga olgan load_plugins nomli usul bor.

Shu nuqtai nazardan, Sinatra o'z yo'nalishini qanday boshqarayotganiga qiziqaman. SinatraAppni birinchi marta ishga tushirganida, uni raft jarayonida xotirada ushlab turadimi (yoki siz buning ichida ishlaysizmi) yoki SinatraApp har bir so'rovni qayta ko'rib chiqadimi?

Ssenariyni olib boring, UserA HTML-sahifani qaytaradigan marshrutni yuklaydi, UserA havolani bosadi va plagin yo'qligi uchun 404-ni qaytaradi, AdminA keyin plaginlar papkasida yangi plagin qo'shadi, UserA o'z sahifalarini yangilaydi va ular plagin marshrutni qo'shganligi uchun 404 o'rniga html sahifasini olish.

Yuqorida aytib o'tilgan voqealar sodir bo'ladimi yoki men yangi plagin faylini olish uchun Sinatra serverini qayta tiklashim kerakmi?

Menimcha, u har bir so'rovni yuklagan plaginlarni yangilashini umid qilmoqda ... Biroq, agar har bir so'rovda plaginlar uchun kataloglarni tekshirish kerak bo'lsa, unda mening ishlashim chiroyli ekanini bilaman.

== Edit ==

Quyida men nimani nazarda tutayotganimga misolni qo'shdik. SinatraMain ilovasi doirasida qo'ng'iroq qilish kerakligini bilib olishi uchun, u "" mavjud maydonga kodni to'ldirishni o'z ichiga oladigan bo'lsa, quyida keltirilgan modul yoki chap qator qatori kabi tuzilishi kerakligiga ishonchim komil emas. sizni keyin nima qilganimni ko'rsatib beradi.

require 'sinatra'

class SinatraMain < Sinatra::Base

    def load_plugins
        Dir["/plugins/**/routing-plugin.rb"].each  do |plugin_file| 
            include plugin_file
        end
    end

  get "/test" do
    return "This is a test route"
  end

get "/plugins/*" do
   load_plugins
   return "Plugins refreshed"
end
end

SinatraMain.run!

# Imagine this was within /plugins/SayHelloPlugin/routing-plugin.rb
get "/say-hello"
    return "Saying hello"
end

Shunday qilib, bu plaginlar papkasida ushbu plaginlari fayllari qo'shilsa, u holda ularni marshrutlarni ilovaga qo'shishlari va ularni olib tashlashlari ularni marshrutizatsiya ostidan chiqarishlari kerak (garchi oxirgi nuqta not \ hozirgi kunga qadar muhimdir).

3

1 javoblar

Mening manbamni o'qishdan (https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb) Sinatra Sinatra :: Base sinfida marshrutlarni sinfi sifatida o'zgartiradi, shuning uchun marshrutlar qayta ishlamaydi Sinatra/Rack har bir so'rov uchun ilovangizning yangi namunasini yaratgan bo'lsa-da, har bir so'rov bo'yicha baholanadi.

Siz barcha marshrutlarni qayta yuklamasdan, ish vaqtida qo'shimcha marshrutlarni qo'shishingiz mumkin. Men sizning plaginlaringizni qanday qilib yuklayotganingizni bilmayman, lekin Sinatrani qayta boshlamasdan xohlagan narsani qilishingiz mumkin, bu yangi marshrutni qo'shadigan yovuz demo/tajriba:

require 'rubygems'
require 'sinatra/base'

class App < Sinatra::Base
  get '/' do
    "hello [self.object_id: #{self.object_id}, App.routes.object_id: #{App.routes.object_id}]"
  end

  get '/add_route' do
    App.get '/new_route' do
      "from new route [self.object_id: #{self.object_id}, App.routes.object_id: #{App.routes.object_id}]"
    end
    "new route added [self.object_id: #{self.object_id}, App.routes.object_id: #{App.routes.object_id}]"
  end

  run! if /app.rb$/ =~ $0
end

Agar siz bu ishni boshlasangiz, App har bir so'rov uchun yangi object_id olishini ko'rasiz, lekin App.routes hash - butun bir xil ob'ekt.

2
qo'shib qo'ydi
Asosiy maqolani men nimani nazarda tutganimni bir misol bilan tahrir qilaman
qo'shib qo'ydi muallif Grofit, manba
Hozir men plaginlarda faqatgina yuklash bilan baxtiyorman va ularni olib tashlash uchun dasturni qayta yuklayman. Hozir mening misolimda/plugins/* marshrutida har qanday plaginlarni yangilash kerak. Sizga javob beradigan bo'lsa-da!
qo'shib qo'ydi muallif Grofit, manba
Shuning uchun load_plugins usuli yoki shunga o'xshash biror narsalarni ishga tushirish uchun sizga taqiqlanmagan fayllarni kuzatish uchun kerak. O'zim qilgan narsam emas, balki, ruby faylini kuzatuvchilarning qatorlari mavjudligini bilaman, masalan. EventMachine sizning ilovangizga qo'shilishingiz mumkin. Plagin fayllaringizda faqat SinatraMain sinfingizni kengaytira olasiz va Kernel # yukini yoki Kernel # ni yuklashni talab qilishingiz mumkin. O'chirilgan plaginlarni olib tashlash uchun, men ularni qanday o'chirish uchun qanday qo'shimchalar qo'shilganligini kuzatib borishingiz kerak deb o'ylayman.
qo'shib qo'ydi muallif Steve, manba