Ner*_*rve 2 ruby-on-rails ruby-on-rails-3
我希望在每次请求之前在rails app中运行一段代码.此外,它应该在达到之前运行application_controller.rb
.
我知道我们可以把这些东西放进去config/initializers
或者application.rb
.但是,我想在每个请求之前运行它.
你会想写一些Rack Middleware.这很容易做到,这是一个简单的例子,它为多租户范围的目的获取子域:
class ClientSetup
def initialize(app)
@app = app
end
def call(env)
@request = Rack::Request.new(env)
Multitenant.current_tenant = Tenant.find_by_subdomain!(get_subdomain)
@app.call(env)
end
private
def get_subdomain
host = @request.host
return nil unless !(host.nil? || /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.match(host))
subdomain = host.split('.')[0..-3].first
return subdomain unless subdomain == "www"
return host.split('.')[0..-3][1]
end
end
Run Code Online (Sandbox Code Playgroud)
周围有更多的例子.然后,您需要将此类添加到中间件堆栈中:
config.middleware.use 'ClientSetup'
Run Code Online (Sandbox Code Playgroud)
在你的application.rb
.
听起来像Rack中间件的工作.您可以查看机架指南中的Rails和RailsCast以获取详细信息.
所以在lib中添加如下内容:
#lib/my_app_middleware.rb
class MyAppMiddleware
def initialize(app)
@app = app
end
def call(env)
# place the code that you want executed on every request here
end
end
Run Code Online (Sandbox Code Playgroud)
以及config/application.rb中的以下内容以启用中间件
config.middleware.use MyAppMiddleware
Run Code Online (Sandbox Code Playgroud)
检查它插入好了:
rake middleware
Run Code Online (Sandbox Code Playgroud)
而已!