`

Ruby神奇的nil.id

    博客分类:
  • ruby
阅读更多
今天早上遇到了一个问题,网站上有几个奇怪的数据,他们的用户id都是4,但是我们网站上的用户id设置的是最低 1000 并且是依次递增的,怎么回事呢

几个人共同探讨,查看程序,讨论逻辑,最后都是没有结论


接下来有人突然想起了下面这件事情
---------------------------------------------------------------------------------

前几天我在网上看文章发现了一个很有趣的问题
就是ruby对 nil.object_id 的定义

>> nil.object_id
=> 4

我看着挺有意思,就跟同事共享了一下

-------------------------------------------------------------------------------
再去看代码,果然是用户在没有登录的情况下做了操作,产生了 nil.id

-----------
另外还有一个小插曲
那就是开发模式与产品模式下运行nil.id 结果是不一样的

开发模式(development)下或直接抛异常
>> nil.id
RuntimeError: Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
        from (irb):1


而产品模式(production)下则仅仅是警告,有返回值
>> nil.id
(irb):1: warning: Object#id will be deprecated; use Object#object_id
=> 4


真真的是陷阱无处不在啊
------------------------------------------------------------------------------
好吧,问题到此结束
除此之外令人感到很神棍的事情就是,前几天我看到了这个东西,今天竟然奇迹般的就用上了


关于nil.object_id 的帖子  其实很老的问题了,汗
http://www.iteye.com/topic/514383
分享到:
评论

相关推荐

    Ruby的25个编程细节(技巧、实用代码段)

    如果 `Province.find_by_name(prov)` 返回 `nil`,那么 `.try(:id)` 也不会抛出异常,而是返回 `nil`。 #### 2. 使用 `find(:first, :conditions)` 查询单条记录 在Rails中,`find` 方法有许多变体,其中之一就是 ...

    Ruby-GraphQL的ActionPolicy集成

    def users(id: nil) policy_scope(User).where(id: id) end end end ``` 这里的`policy_scope`是ActionPolicy提供的一个便利方法,它会返回当前上下文中允许操作的对象集合。这确保了只有符合策略的用户才能被...

    Ruby多线程编程初步入门

    puts "Thread #{Thread.current.object_id} mycount is #{Thread.current[:mycount]}" } end arr.each(&:join) ``` 这段代码中,每个线程都会将自己的计数值存储在线程局部变量`mycount`中,并输出该值。这样...

    Ruby-graphqlruby的插件它有助于仅从数据库中选择所需的字段

    field :id, ID, null: false field :title, String, null: false field :content, String, null: true # 添加自定义解决器 def title context[:current_user].can_read_post?(object) ? object.title : nil ...

    Container.rb:方便的 Ruby 对象容器,提供更清晰的视图

    方便的 Ruby 对象容器,提供更清晰的视图 安装 容器可用作 RubyGem: $ gem install container 基本用法:容器 容器同时充当数组和哈希 tags = Container . new tags << "Master" tags << "Disabled...

    Ruby连接使用windows下sql server数据库代码实例

    ### Ruby连接Windows下的SQL Server数据库方法详解 在本篇文章中,我们将详细介绍如何使用Ruby语言连接并操作部署在Windows系统下的SQL Server数据库。该方法适用于希望使用Ruby进行数据库操作的开发者们,尤其是...

    Windows下Ruby+Watir自动化测试的环境搭建及数据读取

    def generate_sql(table, what = nil, where = nil) what ||= "*" where ||= "1=1" "SELECT #{what} FROM #{table} WHERE #{where}" end def generate_hash(header, all_data) t_arr = [] all_data.each do |...

    ruby-pardot:用Ruby编写的Pardot API客户端

    安装 将以下内容添加到您的Gemfile中 gem "ruby-pardot" 用法 身份验证 为了使用此客户端,必须指定从Salesforce OAuth检索的访问令牌。 有关更多信息,请参见[ 身份验证文档]... new nil , nil , nil , version ,

    Luminati:用于与 Luminati.io-network 通信的 Ruby 包装器

    卢米纳蒂用于与 Luminati.io 网络通信的 ... get_connection ( country : nil , dns_resolution : nil , session : nil )session_id = connection [ :session_id ]proxy_user = connection [ :username ]proxy_passw

    stronger_parameters:操作包的类型检查和参数的类型转换

    strong_parameters 这是strong_parameters的扩展,增加了类型检查和转换功能。... Rails将空数组转换为nil,因此通常使用Parameters.array | Parameters.nil Parameters.array | Parameters.nil是必需的。

    memery:Ruby中用于记忆的瑰宝

    find ( some_id )end 但是,如果计算结果可以为nil或false或该方法使用参数,则此方法不起作用。 如果您的方法需要多行,您还将需要额外的begin / end行: def user @user ||= begin some_id = calculate_id klass ...

    rails _sunspot 学习笔记

    <strong><%= row.value %></strong> (, :class => nil %>) <% @results.each do |s| %> <div id="search_result"> <% if s.class.name == "Foo" %> <!-- 显示 Foo 模型的相关数据 --> <% elsif s....

    实例讲解Ruby中的五种变量

    Ruby是一种面向对象的编程语言,它提供了五种不同的变量类型,每种都有其特定的作用域和用法。这里我们将深入探讨这些变量,包括全局变量、实例变量、类变量。 1. **全局变量**:全局变量在Ruby中以 `$` 符号开头。...

    RPGXP脚本_漂亮对话框

    def chat(id = nil, name = "") $mes_id = id $mes_name = name end ``` - 定义了一个`chat`函数,用于初始化对话的ID和名字。 5. **游戏临时状态管理**: ```ruby class Game_Temp attr_accessor :...

    rapiflash-ruby-gem:这个 gem 是 Rapiflash API 的包装器,允许开发人员从世界各地的 Rapiflash 设备收集数据

    Rapiflash Ruby这个官方 gem 是 Rapiflash API 的包装器,允许开发人员从世界各地的 ...Flood:0x0000000152c398 @id=1, @normal_level=4.5, @current_level=5.0, @flooded=false, @upstream=nil, @location="Australia

    swift使用sqlite Demo

    let user = User(id: nil, name: "John Doe", age: 25) try db.run(user.insert(User.columns)) ``` 查询数据则可以使用`select`、`from`和各种查询条件: ```swift let users = try User.filter(\.age > 20)....

    fred:圣路易斯美联储经济数据(FRED)API的Ruby包装器

    弗雷德 这是St. Louis Federal Reserve Economic Data 的Ruby包装器。 安装 作为宝石: ... >> fred.category(nil, :category_id => '125') => <#Hashie::Mash categories=<#Hashie::Mash catego

    Ruby on Rails实现最基本的用户注册和登录功能的教程

    @current_user = nil redirect_to root_url end end ``` ##### 3. 设计登录界面 设计登录界面,确保用户能够输入用户名和密码。 ```html <!-- app/views/sessions/new.html.erb --> 登录 , url: sessions_...

    Ruby on Rails中的ActiveResource使用详解

    def self.element_path(id, prefix_options = {}, query_options = nil) prefix_options, query_options = split_options(prefix_options) if query_options.nil? "#{prefix(prefix_options)}#{collection_name}/...

Global site tag (gtag.js) - Google Analytics