• @lidashuang 单指你这个例子,会用,并且对 belongs_to API 熟练才好维护,如果是不熟练的人写出的真不一定好维护,因为大家对越魔性的代码理解偏差越大。例如 Sidekiq 的 delay 方法,很简单但也很神奇,用着用着可能发现解决问题花的时间比这个方法因为省下的时间更多的:https://github.com/mperham/sidekiq/issues/2211

  • Mini SQL 支持 MySQL 了 at 2019年09月23日

    关闭讨论功能可以考虑加一步确认,好像挺多帖子点错的😀

  • 少代码一般来说意味着更好维护,但是由于少代码也意味着高抽象,需要更熟练的人才能使用的更好,所以最终好不好维护还是要看使用者😀

  • 开发环境:

    开发环境是惰性加载,Shop 常量一开始不存在,所以会触发 const_missing,使用 Rails 的自动加载机制。加载的顺序是:Api::BooksController::Shop -> Api::Shop(找到了) -> Shop,然后继续自动加载常量 Event,顺序:Api::Shop::Event -> API::Event -> Event,最终没找到,抛出异常

    生产环境:

    因为生产环境预先把所有 autoload 目录下的文件都加载过了,这里没有触发 const_missing,使用的是 Ruby 自身的常量查找。查找顺序是:Api::BooksController::Shop -> Shop(找到了)(这里没有 Api::Shop 是因为你定义 controller 的方式没有开启新的命名空间)。然后加载 Event 常量,得到 Shop::Event。

    要彻底解决这类问题的话,我认为最好不要在自动加载类中使用限定常量(Rails 对于限定常量的加载处理不太好理解)。

    首先把 controller 的限定常量改成相对常量定义:

    module Api
      class BooksController < ApplicationController # 使用相对常量代替限定常量
        ...
      end
    end
    

    那么两种加载方式就一致了,生产环境也会报错了。解决这第二个问题的话,把另外一个限定常量改成绝对常量就好了。

    # app/controllers/api/books_controller.rb
    module Api
      class BooksController < ApplicationController # 使用相对常量代替限定常量
        def self.test
          ::Shop::Event.test # 使用绝对常量代替限定常量
        end
      end
    end
    
  • 如果你有个 Api::Shop 这个常量就会出现这样的问题,Rails 限定常量加载有点问题。

  • 有时候会需要用到一些白板类,这些类不继承自 Object,这时候如果你想调用 Kernel 的某些方法的话,就要用到 singleton method 了

  • def print_half_diamond(lines, width: 5)
      cycle = width * 2 - 2
      return lines.times { puts '*' } if cycle.zero?
      lines.times do |line|
        index = line % cycle + 1
        count = index <= width ? index : width * 2 - index
        puts '*' * count
      end
    end
    
  • 新年快乐,祝大家万事如意🎈 🎈

  • 不行

  • 实现不了的,没办法统一添加,只能为每一个需要修改核心方法的类添加 using 语句。

    Refinements 作用域只有顶级、Module 和 Class,且遇到 end 就停止了,不能用在 Method 上。

    You may activate refinements at top-level, and inside classes and modules. You may not activate refinements in method scope. Refinements are activated until the end of the current class or module definition, or until the end of the current file if used at the top-level.

  • 新人求助:ArgumentError at 2019年01月06日

    写全了就是

    find_room_in_dungeon(@player.location).connections([direction])

    这应该不是你的本意了吧

  • 新人求助:ArgumentError at 2019年01月06日

    是方法内部发生了异常,

    find_room_in_dungeon(@player.location).connections [direction]

    这里 [] 前面多了个空格,导致当成参数了

  • asset 图片显示问题 at 2018年12月03日
  • 关于类变量的疑问 at 2018年12月02日

    给你补上例子

    class A
      def initialize
        @path=''
      end
      def path
        @path
      end
    end
    class B < A
      def initialize
        @path='b'
      end
    end
    class C < A
      def initialize
        @path='c'
      end
    end
    
    obj= B.new
    puts obj.path
    
  • 关于类变量的疑问 at 2018年12月02日

    像你这种情况是不想公用属性啊,那应该用实例变量而不是类变量。

    但要记得实例变量区分类和他的单例类两个作用域,因此要把初始化的操作移到构造函数中,像上面在类中初始化会得不到你期望的效果

  • 关于类变量的疑问 at 2018年12月01日

    首先这段代码最后的结果就是 c,最简单的,开一个 irb 把代码都粘贴上去验证一下就行了。你上面提到的 Nginx 结果没有什么问题,至于 rails s 结果错误,肯定是因为别的原因(我猜想你的 B, C 都是自动加载类,然后实际上验证结果时 C 没有加载或者 B 在 C 之后加载的)。

    至于结果为什么是 c,是因为 Ruby 的类变量会和所有子类以及他们的单例类共享的,即在上述的所有作用域中 @@path 的内存指向都是一样的。

    class A
      @@path=''
    
      def path_object_id
        @@path.object_id
      end
    
      def self.path_object_id
        @@path.object_id
      end
    
      puts path_object_id # => 70139278257540
      puts self.new.path_object_id # => 70139278257540
    end
    
    class B < A
      puts @@path.object_id # => 70139278257540
      puts self.new.path_object_id # => 70139278257540
    end
    
    class C < A
      puts @@path.object_id # => 70139278257540
    end
    
  • 可以用继承钩子解决你的问题,Class#inherited

  • 数组哈希累加 at 2018年11月15日
    records.each_with_object({}) do |record, hash|
      record.each do |k, v|
        hash[k] ||= 0.0
        hash[k] += v
      end
    end
    
  • Ruby China 7 岁生日快乐 at 2018年10月28日

    🎂 🎂 🎂

  • 你这个伪装骗过了服务器,但没有骗过浏览器,浏览器还是当成 AJAX 请求处理

  • 重定向是浏览器才有权利做的事情,服务端只能作出指示。

    如果是普通请求,浏览器收到服务端重定向 (3xx 状态码) 的指示后,会自动再向指示的地址发送一个请求,达到页面刷新。

    如果变成了 AJAX 请求,浏览器是不会响应重定向状态码指示的,这时候可以用 #3 上面说的方法,渲染一段 JS 代码给浏览器,浏览器收到后会执行实现页面刷新

  • 会很有帮助,收集一下大家的主要问题回答。但是最后还是要汇集展现出来,说到底社区还是需要原来的 Wiki 这样的教程,现在是内容无法及时更新的问题对吧。

  • 第一步,可以从翻译已有的文档开始:

    后面可以对国情添加一些指导,这样对新人的帮助也是一个很大的提高(新人经验少,如上面所说社区已有帖子各种教程个人观点多,对他们来说筛选起来并不简单,大多数人更希望能有一个 Wiki 或 Guides 的东西直接指导怎么做)

  • 没这个需求。(要打卡可以找虚拟定位)

  • Awesome Ruby China at 2018年10月05日

    是的