Rails在application.rb之前的每个请求之前运行代码

Ner*_*rve 2 ruby-on-rails ruby-on-rails-3

我希望在每次请求之前在rails app中运行一段代码.此外,它应该在达到之前运行application_controller.rb.

我知道我们可以把这些东西放进去config/initializers或者application.rb.但是,我想在每个请求之前运行它.

Mik*_*ell 6

你会想写一些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.


And*_*ing 6

听起来像Rack中间件的工作.您可以查看机架指南中RailsRailsCast以获取详细信息.

所以在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)

而已!