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

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

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

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

共收到 2 条回复

昨天困扰了一下午,今天问题解决了。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

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