Rails Rack::Request 与 ActionDispatch::Request 之间有什么联系吗?

lengcb · 2017年12月27日 · 最后由 theblock24block 回复于 2017年12月27日 · 1414 次阅读

Rack::Request 与 ActionDispatch::Request 之间有什么联系吗?我遇到一个问题,就是在请求头部传了一个参数,在 controller 中通过 request.headers['xxxx'] 可以获取到;在另一个地方可以调用 request.env,我本想也用 request.headers['xxxx'] 来获取这个参数,但是发现调用不了。

我发现前一个 request 的 class 是 ActionDispatch::Request,后一个是 Rack::Request。这两者之间有什么联系吗?怎么从 Rack::Request 获取请求头中的参数呢?表述不是很清晰,请见谅。希望高手给解惑

昨天困扰了一下午,今天问题解决了。request.env 中会将请求头部传的参数加上一个 HTTP_前缀。但是对这两者的关系还是没有明确的认识

都是把 env 包装一下,但 ActionDispatch::Request 会方便一点不用写 HTTP_

# Converts an HTTP header name to an environment variable name if it is
# not contained within the headers hash.
def env_name(key)
  key = key.to_s
  if key =~ HTTP_HEADER
    key = key.upcase.tr("-", "_")
    key = "HTTP_" + key unless CGI_VARIABLES.include?(key)
  end
  key
end
ENV_METHODS.each do |env|
  class_eval <<-METHOD, __FILE__, __LINE__ + 1
    def #{env.sub(/^HTTP_/n, '').downcase}  # def accept_charset
      get_header "#{env}".freeze            #   get_header "HTTP_ACCEPT_CHARSET".freeze
    end                                     # end
  METHOD
end

此外 rails 还会 mixin 其它一些便利东西,所以需要一个新的类来代表 request

需要 登录 后方可回复, 如果你还没有账号请 注册新账号