我正在尝试编写一个将组件组合在一起的Sinatra应用程序(有点像控制器).所以对于"博客"相关的东西,我想要一个名为Blogmount 的应用程序/blog.Blog应用程序中包含的所有路径都与其安装路径相关,因此我可以简单地定义index路径,而无需在路径中指定装载路径.
我最初通过使用config.ru文件和map路由到不同的应用程序来处理这个问题.我遇到的问题是,我使用的是所有应用程序中需要包含的各种sinatra gems/extensions/helper,因此有很多重复的代码.
如何在另一个应用程序中安装一个sinatra应用程序,以便应用程序中定义的路径相对于安装应用程序的位置?如果这不可能是开箱即用的,你能否展示如何做到这一点的代码示例?
这是一个简单的例子:
class App
mount Blog, at: '/blog'
mount Foo, at: '/bar'
end
class Blog
get '/' do
# index action
end
end
class Foo
get '/' do
# index action
end
end
Run Code Online (Sandbox Code Playgroud)
看看/sf/answers/1098985401/其中有一些关于命名空间的想法。
就我个人而言,我会使用带有映射路由的 config.ru。如果您确实处于“这应该是一个单独的应用程序还是像这样组织它只是有帮助”之间的空间,那么它允许这样做,然后您仍然可以在不更改代码的情况下自行开发其中一个应用程序(或只有一点点)。如果您发现有很多重复的设置代码,我会这样做:
# base_controller.rb
require 'sinatra/base'
require "haml"
# now come some shameless plugs for extensions I maintain :)
require "sinatra/partial"
require "sinatra/exstatic_assets"
module MyAmazingApp
class BaseController < Sinatra::Base
register Sinatra::Partial
register Sinatra::Exstatic
end
class Blog < BaseController
# this gets all the stuff already registered.
end
class Foo < BaseController
# this does too!
end
end
# config.ru
# this is just me being lazy
# it'd add in the /base_controller route too, so you
# may want to change it slightly :)
MyAmazingApp.constants.each do |const|
map "/#{const.name.downcase}" do
run const
end
end
Run Code Online (Sandbox Code Playgroud)
以下是Sinatra Up and Running中的一段话:
不仅是设置,Sinatra 类的每个方面都将被其子类继承。这包括定义的路由、所有错误处理程序、扩展、中间件等。
它有一些使用这种技术(和其他技术)的好例子。因为我处于无耻的插头模式,所以我推荐它,即使我与它无关!:)
| 归档时间: |
|
| 查看次数: |
1542 次 |
| 最近记录: |