Railsソース研究のActionController:五,cookies
2126 ワード
cookies.rb:
Cookiesモジュールは、cookiesメソッドが初期化されたCookieJarクラスを返すことを定義し、CookieJarはHashクラスに継承され、CookieJarが初期化されたとき@cookies=controller.request.cookies
CookieJarには[]と[]=メソッドとdeleteメソッドが再ロードされています.これにより、controllerでcookies[]を直接使用してcookieを取得し、設定することができます.
具体的な操作set_クッキーはresponseにあるheadersにCGI:Cookieオブジェクトを入れる
CGI:Cookieの定義はaction_を参照controller\cgi_ext\cookie_performance_fix.rb:
CGI:CookieクラスエージェントからArrayクラスへ
module ActionController
module Cookies
protected
def cookies
CookieJar.new(self)
end
end
class CookieJar < Hash
def initialize(controller)
@controller, @cookies = controller, controller.request.cookies
super()
update(@cookies)
end
def [](name)
@cookies[name.to_s].value.first if @cookies[name.to_s] && @cookies[name.to_s].respond_to?(:value)
end
def []=(name, options)
if options.is_a?(Hash)
options = options.inject({}) { |options, pair| options[pair.first.to_s] = pair.last; options }
options["name"] = name.to_s
else
options = { "name" => name.to_s, "value" => options }
end
set_cookie(options)
end
def delete(name)
set_cookie("name" => name.to_s, "value" => "", "expires" => Time.at(0))
end
private
def set_cookie(options)
options["path"] = "/" unless options["path"]
cookie = CGI::Cookie.new(options)
@controller.logger.info "Cookie set: #{cookie}" unless @controller.logger.nil?
@controller.response.headers["cookie"] << cookie
end
end
end
Cookiesモジュールは、cookiesメソッドが初期化されたCookieJarクラスを返すことを定義し、CookieJarはHashクラスに継承され、CookieJarが初期化されたとき@cookies=controller.request.cookies
CookieJarには[]と[]=メソッドとdeleteメソッドが再ロードされています.これにより、controllerでcookies[]を直接使用してcookieを取得し、設定することができます.
具体的な操作set_クッキーはresponseにあるheadersにCGI:Cookieオブジェクトを入れる
CGI:Cookieの定義はaction_を参照controller\cgi_ext\cookie_performance_fix.rb:
CGI.module_eval { remove_const "Cookie" }
class CGI
class Cookie < DelegateClass(Array)
...
end
end
CGI:CookieクラスエージェントからArrayクラスへ