class Camping::Server
Constants
- T
Ensure trailing slash lambda
Public Class Methods
# File lib/camping/server.rb, line 130 def initialize(*) super @reloader = Camping::Reloader.new(options[:script]) do |app| if !app.options.has_key?(:dynamic_templates) app.options[:dynamic_templates] = true end if !Camping::Models.autoload?(:Base) && options[:database] Camping::Models::Base.establish_connection( :adapter => 'sqlite3', :database => options[:database] ) end end end
Public Instance Methods
add the public directory as a Rack app serving files first, then the current value of self, which is our camping apps, as an app.
# File lib/camping/server.rb, line 197 def app Rack::Cascade.new([Rack::Files.new(public_dir), self], [405, 404, 403]) end
call(env) res
How routing works¶ ↑
The first app added using Camping.goes is set at the root, we walk through the defined routes of the first app to see if there is a match. With no match we then walk through every other defined app. When we reach a matching route we call that app and Camping’s router handles the rest.
Mounting apps at different directories is now explicit by setting the url_prefix option:
camping.goes :Nuts # Mounts Nuts at / module Auth set :url_prefix, "auth/" end camping.goes :Auth # Mounts Auth at /auth/ camping.goes :Blog # Mounts Blog at /
Note that routes that you set explicitly with R are not prefixed. This us explicit control over routes:
module Auth::Controllers class Whatever < R '/thing/' # Mounts at /thing/ def get render :some_view end end end
# File lib/camping/server.rb, line 250 def call(env) @reloader.reload apps = @reloader.apps # our switch statement iterates through possible app outcomes, no apps # loaded, one app loaded, or multiple apps loaded. case apps.length when 0 [200, {'Content-Type' => 'text/html'}, ["I'm sorry but no apps were found."]] when 1 apps.values.first.call(env) # When we have one else # 2 and up get special treatment apps.each do |name, app| app.routes.each do |r| if (path_matches?(env['PATH_INFO'], r)) return app.call(env) next end end end # Just return the first app if we didn't find a match. return apps.values.first.call(env) end end
# File lib/camping/server.rb, line 150 def default_options super.merge({ :Port => 3301, :database => Options::DB }) end
# File lib/camping/server.rb, line 157 def middleware h = super h["development"] << [XSendfile] h end
# File lib/camping/server.rb, line 146 def opt_parser Options.new end
path_matches? accepts a regular expression string in our case our apps and controllers
# File lib/camping/server.rb, line 204 def path_matches?(path, *reg) p = T.(path) reg.each do |r| return true if Regexp.new(T.(r)).match?(p) && p == T.(r) end false end
defines the public directory to be /public
# File lib/camping/server.rb, line 191 def public_dir File.expand_path('../public', @reloader.file) end
# File lib/camping/server.rb, line 163 def start # If routes option was chosen to short circut here if options[:routes] == true @reloader.reload! r = @reloader eval("self", TOPLEVEL_BINDING).meta_def(:reload!) { r.reload!; nil } ARGV.clear Camping::Commands.routes exit end if options[:server] == "console" puts "** Starting console" @reloader.reload! r = @reloader eval("self", TOPLEVEL_BINDING).meta_def(:reload!) { r.reload!; nil } ARGV.clear IRB.start exit else name = server.name[/\w+$/] puts "** Starting #{name} on #{options[:Host]}:#{options[:Port]}" super end end