如何仅在rails 2应用程序中访问请求标头?

Gui*_*ira 3 ruby-on-rails

Rails提供了一个request.headers方法,它返回所有标题和大量额外的非标题信息...我只想访问请求标题,我该怎么办?

问候

vla*_*adr 5

您基本上必须隔离所有带有前缀的环境条目,HTTP_或者CONTENT_对应于您的HTTP标头,例如:

# CONTENT_LENGTH -> Content-Length
# HTTP_COOKIE -> Cookie
# HTTP_USER_AGENT -> User-Agent
@headers |= request.env.inject({}) { |h, (k, v)|
  if k =~ /^(HTTP|CONTENT)_/ then
    h[k.sub(/^HTTP_/, '').dasherize.gsub(/([^\-]+)/) { $1.capitalize }] = v 
  end
  h
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以更具限制性,只查找特定的 HTTP标头,以避免意外地拾取可能看起来像标题但实际上并不有效的环境变量,例如CONTENT_BLAHTTP_DUMMY.

@headers |= %w[ CONTENT_LENGTH CONTENT_TYPE HTTP_ACCEPT
HTTP_REFERER HTTP_USER_AGENT ].inject({}) { |h, k|
  if v = request.env[k] then
    h[k.sub(/^HTTP_/, '').dasherize.gsub(/([^\-]+)/) { $1.capitalize }] = v 
  end
  h
}
Run Code Online (Sandbox Code Playgroud)

看看actionpack/lib/action_controller/request.rb他们如何梳理环境以提取请求标头.