mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Introduce Rails Metal
# app/metal/poller.rb class Poller < Rails::Rack::Metal def call(env) if env["PATH_INFO"] =~ /^\/poller/ [200, {"Content-Type" => "application/json"}, Message.recent.to_json] else super end end end * There is a generator to help you get started `script/generate metal poller` * Also, metal bits can be ran standalone with rackup `rackup app/metal/poller.rb`
This commit is contained in:
parent
c4023cbe20
commit
8c3a543664
6 changed files with 60 additions and 0 deletions
|
@ -155,6 +155,8 @@ module Rails
|
|||
initialize_framework_settings
|
||||
initialize_framework_views
|
||||
|
||||
initialize_metal
|
||||
|
||||
add_support_load_paths
|
||||
|
||||
load_gems
|
||||
|
@ -533,6 +535,12 @@ Run `rake gems:install` to install the missing gems.
|
|||
end
|
||||
end
|
||||
|
||||
def initialize_metal
|
||||
Dir["#{configuration.root_path}/app/metal/*.rb"].each do |file|
|
||||
configuration.middleware.use(File.basename(file, '.rb').camelize)
|
||||
end
|
||||
end
|
||||
|
||||
# Initializes framework-specific settings for each of the loaded frameworks
|
||||
# (Configuration#frameworks). The available settings map to the accessors
|
||||
# on each of the corresponding Base classes.
|
||||
|
@ -915,6 +923,7 @@ Run `rake gems:install` to install the missing gems.
|
|||
# Followed by the standard includes.
|
||||
paths.concat %w(
|
||||
app
|
||||
app/metal
|
||||
app/models
|
||||
app/controllers
|
||||
app/helpers
|
||||
|
@ -933,6 +942,7 @@ Run `rake gems:install` to install the missing gems.
|
|||
|
||||
def default_eager_load_paths
|
||||
%w(
|
||||
app/metal
|
||||
app/models
|
||||
app/controllers
|
||||
app/helpers
|
||||
|
|
|
@ -2,6 +2,7 @@ module Rails
|
|||
module Rack
|
||||
autoload :Debugger, "rails/rack/debugger"
|
||||
autoload :Logger, "rails/rack/logger"
|
||||
autoload :Metal, "rails/rack/metal"
|
||||
autoload :Static, "rails/rack/static"
|
||||
end
|
||||
end
|
||||
|
|
21
railties/lib/rails/rack/metal.rb
Normal file
21
railties/lib/rails/rack/metal.rb
Normal file
|
@ -0,0 +1,21 @@
|
|||
module Rails
|
||||
module Rack
|
||||
class Metal
|
||||
NotFound = lambda { |env|
|
||||
[404, {"Content-Type" => "text/html"}, "Not Found"]
|
||||
}
|
||||
|
||||
def self.call(env)
|
||||
new(NotFound).call(env)
|
||||
end
|
||||
|
||||
def initialize(app)
|
||||
@app = app
|
||||
end
|
||||
|
||||
def call(env)
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,8 @@
|
|||
Description:
|
||||
Cast some metal!
|
||||
|
||||
Examples:
|
||||
`./script/generate metal poller`
|
||||
|
||||
This will create:
|
||||
Metal: app/metal/poller.rb
|
|
@ -0,0 +1,8 @@
|
|||
class MetalGenerator < Rails::Generator::NamedBase
|
||||
def manifest
|
||||
record do |m|
|
||||
m.directory 'app/metal'
|
||||
m.template 'metal.rb', File.join('app/metal', "#{file_name}.rb")
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,12 @@
|
|||
# Allow the metal piece to run in isolation
|
||||
require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails)
|
||||
|
||||
class <%= class_name %> < Rails::Rack::Metal
|
||||
def call(env)
|
||||
if env["PATH_INFO"] =~ /^\/<%= file_name %>/
|
||||
[200, {"Content-Type" => "text/html"}, "Hello, World!"]
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue