`
星情泪
  • 浏览: 16335 次
  • 性别: Icon_minigender_1
  • 来自: 河北
最近访客 更多访客>>
社区版块
存档分类
最新评论

rails2.3的cookies

阅读更多
2.1.2下

  • cookies每次随着用户访问都会发送的服务器
  • cookies只能存储字符串
  • cookie是一种类似于Hash的结构,但它的类型是ActionController#cookies


它和普通的hash类似,在操作上有些不同
# example 1
def index
	cookies[:name] = "kitty"
	p cookies[:name]
end

# 第一次访问
# => nil

# 第二次访问
# => kitty


引用一段对此说明
引用

cookies in rails is of type CookieJar. CookieJar manages incoming and outgoing cookie information and works as follows.


到这,这一切都没什么问题。但疑惑的地方从2.3.4出现了

# example 1
def index
	cookies[:name] = "kitty"
	cookies[:age] = 20
	p cookies[:age].class
	p cookies[:name]
end

# 第一次访问
# => Fixnum
# => Kitty

# 第二次访问
# => Fixnum
# => kitty

cookies在存储值后立马可以访问了,而且也能存储除字符串以外的类型(貌似很奇怪)
这个版本的cookies和session从用法上来讲,好像就没有区别了

找了些相关的资料,也没有找出个所以然来,貌似对rails cookies的讨论不是很多,望指教
分享到:
评论
4 楼 星情泪 2009-10-30  
刚才又试了一次,确实疏忽了,无论存储什么内容,在服务器response之前是可以原样访问的,但response之后再request,就都是字符串了

谢谢你
3 楼 rainchen 2009-10-29  


是的,这句就是关键
  super(key.to_s, options[:value]) #=> 我指的是这一句,但是编辑器没有能给变色显示  


因为:
controller 中的cookies方法,就是CookieJar实例:
# Cookies are read and written through ActionController#cookies.
  module Cookies
      ...
      def cookies
        CookieJar.new(self)
      end
  end


而CookieJar是扩展了一个Hash类:
  class CookieJar < Hash #:nodoc:
  ...
  end


并覆盖了HASH的元素读、写方法:
    def [](name)
      super(name.to_s)
    end

    def []=(key, options)
      ...
      super(key.to_s, options[:value])
      @controller.response.set_cookie(key, options)
    end


可以想象普通的HASH对象读写,什么都能存放:
@cookies = Hash.new
@cookies['mykey'] = AnyThing
puts @cookies['mykey'] #=> AnyThing


只是CookieJar在保存值时,通过@controller.response.set_cookie把值序列化(一般是调用to_s),如果值无法序列化存储的,下次读取出来的肯定会变成空值,因此你要正确测试COOKIE的读写的话,应该分两次request,如:
  def write_cookies
    cookies['mykey'] = 'some text'
    cookies['wrong_value'] = self
    redirect_to :action => 'read_cookies'
  end

  def read_cookies
    render :inline => %{
      <xmp>
        mykey = #{cookies['mykey']}
        wrong_value = #{cookies['wrong_value']}
      </xmp>
    }
  end

否则在同一个action里,读来写去只不过是对同一个HASH对象操作,自然会Rails cookies有“万能”存储的错觉。
2 楼 星情泪 2009-10-25  
Hooopo 写道

还有你第一次已经在客户机上设置name => kitty的cookie了
下次访问当然有了...

你可以清空cookie再试一次。。


这个在我进行测试的时候已经清空了,不知道你有没有对比两个版本测试过

对于2.3中cookies可以在设置值后不用response到客户端就可以访问的现象是否和这句话有关
    # Sets the cookie named +name+. The second argument may be the very cookie
    # value, or a hash of options as documented above.
    def []=(key, options)
      if options.is_a?(Hash)
        options.symbolize_keys!
      else
        options = { :value => options }
      end

      options[:path] = "/" unless options.has_key?(:path)
      super(key.to_s, options[:value]) #=> 我指的是这一句,但是编辑器没有能给变色显示
      @controller.response.set_cookie(key, options)
    end

这是我对比2.1的源代码得到的结论。

至于2.3中cooikes的value可以是对象类型(不仅仅是我上面说过的数值类型,Time也是可以往里存的),在我顺着源代码往上找,一直找到request,而request里面是没有cookies方法的,我猜想可能是它的父类里了吧,但是
class Request < Rack::Request

到这,我就跟丢了
1 楼 Hooopo 2009-10-25  
这个cookies在写入客户端的时候仍然只能是字符串..

还有你第一次已经在客户机上设置name => kitty的cookie了
下次访问当然有了...

你可以清空cookie再试一次。。

这是actioncontroller的cookie.rb源码。写的很明白了。
module ActionController #:nodoc:
  # Cookies are read and written through ActionController#cookies.
  #
  # The cookies being read are the ones received along with the request, the cookies
  # being written will be sent out with the response. Reading a cookie does not get
  # the cookie object itself back, just the value it holds.
  #
  # Examples for writing:
  #
  #   # Sets a simple session cookie.
  #   cookies[:user_name] = "david"
  #
  #   # Sets a cookie that expires in 1 hour.
  #   cookies[:login] = { :value => "XJ-122", :expires => 1.hour.from_now }
  #
  # Examples for reading:
  #
  #   cookies[:user_name] # => "david"
  #   cookies.size        # => 2
  #
  # Example for deleting:
  #
  #   cookies.delete :user_name
  #
  # Please note that if you specify a :domain when setting a cookie, you must also specify the domain when deleting the cookie:
  #
  #  cookies[:key] = {
  #    :value => 'a yummy cookie',
  #    :expires => 1.year.from_now,
  #    :domain => 'domain.com'
  #  }
  #
  #  cookies.delete(:key, :domain => 'domain.com')
  #
  # The option symbols for setting cookies are:
  #
  # * <tt>:value</tt> - The cookie's value or list of values (as an array).
  # * <tt>:path</tt> - The path for which this cookie applies.  Defaults to the root
  #   of the application.
  # * <tt>:domain</tt> - The domain for which this cookie applies.
  # * <tt>:expires</tt> - The time at which this cookie expires, as a Time object.
  # * <tt>:secure</tt> - Whether this cookie is a only transmitted to HTTPS servers.
  #   Default is +false+.
  # * <tt>:httponly</tt> - Whether this cookie is accessible via scripting or
  #   only HTTP. Defaults to +false+.
  module Cookies
    def self.included(base)
      base.helper_method :cookies
    end

    protected
      # Returns the cookie container, which operates as described above.
      def cookies
        @cookies ||= CookieJar.new(self)
      end
  end

  class CookieJar < Hash #:nodoc:
    def initialize(controller)
      @controller, @cookies = controller, controller.request.cookies
      super()
      update(@cookies)
    end

    # Returns the value of the cookie by +name+, or +nil+ if no such cookie exists.
    def [](name)
      super(name.to_s)
    end

    # Sets the cookie named +name+. The second argument may be the very cookie
    # value, or a hash of options as documented above.
    def []=(key, options)
      if options.is_a?(Hash)
        options.symbolize_keys!
      else
        options = { :value => options }
      end

      options[:path] = "/" unless options.has_key?(:path)
      super(key.to_s, options[:value])
      @controller.response.set_cookie(key, options)
    end

    # Removes the cookie on the client machine by setting the value to an empty string
    # and setting its expiration date into the past. Like <tt>[]=</tt>, you can pass in
    # an options hash to delete cookies with extra data such as a <tt>:path</tt>.
    def delete(key, options = {})
      options.symbolize_keys!
      options[:path] = "/" unless options.has_key?(:path)
      super(key.to_s)
      @controller.response.delete_cookie(key, options)
    end
  end
end


相关推荐

    rails 2.3 chm文档 ,官方最新版

    rails 2.3 chm文档 官方最新版

    railsbrain网站的rails2.3文档(bug修复版)

    Railsbrain是一个专注于Rails框架的在线资源平台,而这个“railsbrain网站的rails2.3文档(bug修复版)”显然是一份针对Rails 2.3版本的更新文档,旨在修复用户在浏览和交互过程中遇到的问题。Rails是Ruby编程语言的...

    Ruby on Rails 2.3 Guide.chm

    Ruby on Rails Guide:是rails官方教程,本人为了大家学习查阅的方便,制成chm格式。就如同java doc的chm格式一样方便。

    i18n_routing:用于Rails 2.3.x和Rails的I18n路由模块。轻松转换您的路由!

    所有必需的信息都可以在Wiki上找到: 如有疑问,请使用i18_routing谷歌论坛: 适用于Rails 2.3、3.0、3.1和3.2下一个版本的TODO(写于2010年6月9日) 处理同一资源名称的多个翻译(例如:嵌套和非嵌套资源) 处理...

    ruby on rails 2.3.5 api html版

    Rails是一个基于Ruby语言的开源Web应用程序框架,它遵循模型-视图-控制器(MVC)架构模式,旨在提高开发效率和代码的可读性。 在这个API文档中,你可以找到关于以下关键知识点的详细信息: 1. **Ruby语法基础**:...

    rails 3.2 API

    Rails 3.2 API 是一个重要的开发资源,主要用于Ruby on Rails框架的开发。Rails是基于Ruby语言的一个开源Web应用程序框架,遵循MVC(Model-View-Controller)架构模式,广泛应用于构建动态网站和Web应用程序。Rails ...

    rails2.3.2

    描述中的 "ruby and rails 的框架rails-2.3.3.zip" 提到的是 Rails 的另一个版本 2.3.3,尽管与标题中的版本号不完全匹配,但我们可以推断这是关于 Rails 2.3.x 系列的讨论。这个压缩包很可能包含了 Rails 框架的源...

    pgq:基于 PgQ Skytools for PostgreSQL 的 ARRails 队列系统,如 Resque on Redis。 Rails 2.3 和 3 兼容

    Rails 2.3 和 3 兼容。 关于 PgQ 安装 安装天空工具:Ubuntu 11.10: # apt-get install postgresql-server postgresql-client # apt-get install skytools 宝石档案: gem 'pgq' 从 database.yml 创建股票...

    rails guides 2.3 CHM版

    rails guides的CHM版本,这个向导的版本是2.3

    rsepc-rails-cookies错误

    rails new rspec-rails-cookies-bug --skip-action-mailer --skip-action-mailbox --skip-action-text --skip-active-record --skip-active-storage --skip-action-cable --skip-sprockets --skip-spring --skip-...

    genspec:一个基于 RSpec 的库,用于简洁高效地测试 Rails 生成器

    对于 Rails 2.3 版本,请使用 genspec 0.1.x。 请注意,它不再被积极维护; 只有错误修复才会提交到这个 gem 的 Rails 2.3 版本。 安装 在您的 Gemfile 中... group :test do config . gem 'genspec' end 或者,...

    Rails 101 入门电子书

    ### Rails 101 入门电子书知识点详解 #### 一、简介 《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别...

    Rails项目源代码

    Ruby on Rails,通常简称为Rails,是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式。这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何...

    rails 2.3.2离线安装rails 2.3.2离线安装

    rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails ...

    关于rails 3.1 cucumber-rails 1.2.0

    Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    ### Ruby on Rails Guides v2 - Ruby on Rails 4.2.5 #### 一、重要概念及基础假设 - **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:...

    RailsSpace

    这包括会话管理、Cookies和Sessions的使用等。本章还介绍了如何保护应用免受常见的安全威胁,比如跨站请求伪造(CSRF)攻击。 ##### 3.2 高级登录功能 第七章“Advanced login”进一步深化了登录功能,包括如何实现...

    minitest-spec-rails:使Rails使用MiniTest

    minitest-spec-rails gem使您可以在现有的Rails 2.3、3.x或4.x测试套件中轻松使用MiniTest :: Spec DSL。 它通过强制ActiveSupport :: TestCase利用MiniTest :: Spec :: DSL来实现此目的。 用法 使用默认Rails测试...

Global site tag (gtag.js) - Google Analytics