作为学习练习,我正在制作一个简化的类似Rails的MVC框架。这是流程的简化版本。框架和应用程序在这里结合在一起。
1)启动一个新的Rack应用程序。
# config.ru
require_relative 'config/application.rb'
run Application.new
2)实例化一个Rack请求对象,然后实例化一个新的Router类实例,传递该请求对象,并调用resolve方法。
# config/application.rb
require_relative '../lib/router.rb'
class Application
def call(env)
request = Rack::Request.new(env)
Router.new(request).resolve
end
end
3)创建Router实例后,我正在构建一个@routes变量,该变量分配给应用程序路由及其对应的控制器和操作的哈希。像Rails一样,这是一个障碍。绘制和匹配方法在同一路由器类中定义。Draw运行块,match方法将每个路由添加到@routes哈希中。这很好。
# lib/router.rb
class Router
attr_reader :request, :routes
def initialize(request)
@request = request
@routes = {}
draw do
match "/", "pages#home"
match "/contact", "pages#contact"
match "/about", "pages#about"
end
end
def draw(&block)
instance_eval(&block)
end
def match(url, controller_action)
@routes["#{url}"] = controller_action
end
# more code... def resolve, etc.
end
像Rails一样,我希望在其自己的文件中包含绘图块,以便可以在应用程序的config / routes.rb文件中设置路线,并在框架的lib / router.rb文件中对其进行操作。我该怎么做呢?我尝试过的一切都会引发错误。
尽管它不太像Rails,但您可以尝试根据情况进行调整:
文件routes.rb:
class Routes
def self.routes
Proc.new do
match 'url', 'foo#bar'
match 'url2', 'foo#baz'
end
end
end
文件router.rb:
require_relative './routes'
class Router
attr_reader :routes
def initialize
@routes = {}
draw Routes.routes
end
def draw(block)
instance_eval(&block)
end
def match(url, handler)
@routes[url] = handler
end
end
这样就可以在一个单独的文件路径中定义:
p Router.new.routes # => {"url"=>"foo#bar", "url2"=>"foo#baz"}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句