• 我觉得是不是你 save 的逻辑有问题,在回调里面还有个 save

    你试试给个一定会通过的 validate,看看你的数据会不会 save 两次

  • 楼上说的对 另外 session 的存储方式是可选的,rails 默认使用 cookie 来存,也可以存在服务端的

    说 session 是特殊的,也不算,你可以把它和 param 这个 hash 理解成一类,本质上是在中间件里实现的

    然后你说你需要自己定义一个这样的 hash 来存信息,不是很理解,为用户会话传递信息用 session 足够了吧,有前置验证可以用 before_action

    真要造一个也可以,按 session 的源码写个中间件加进去

  • 这种东西,你让他自己 new 两个新 model 试一下,比你说一百句都管用 他们自己本来就已经搅不清楚了,又不愿意动手,你给他解释再多也不过换来他们一句:哦,这样啊

  • 会是防火墙么? 吃瓜群众路过,还没玩过 ActiveCable

  • 不是黑,对一部分 世界上最好的语言 的程序员来说还是会有帮助的,可以帮刚会 git 的他们用好 git 😂

  • 会不会是这样的: 你的 lvs 是 http 方式转发,无论用户用什么过来,你收到的都是 http,rails 没有开启 ssl 时取当前 host,于是你的会被 301 到 http,然后 lvs 上做了 http 升 https,所以立马又 302 到 https

  • 长见识了,震惊了 at 2016年09月26日

    好厉害的样子

  • 这么快写出这样的总结文,肯定是做了很详细的笔记吧 😄

  • 回调 before_update 的误区 at 2016年09月21日

    before_update 中去 update 这条数据本身么?按 4 楼那样赋值就好了 另外我有点好奇 update_column 应该会直接写数据库然后返回新的对象吧,你这样是不是会有两条数据库写入操作?

    #2 楼 @adamshen 这个问题是不是 after_save 和 after_commit 行为差异的那个坑,之前看文章提到 5 里会修复,也不知道修了没😂

  • #25 楼 @shadow #27 楼 @hanluner 小龙坎对外地来的 会被辣得不要不要的吧 哈哈哈

  • 彩虹桥蜀九香挺近的,不过排队会排到哭吧😂

  • #30 楼 @emanon 擦 我要给你 100 个赞

  • 这种情况啊。。好像有点棘手

    我觉得哈: 从对象间的关系来说,A 和 B 间的关系是相互的,是面对面的关系,而不是 关注某人 这种 面对背 的关系。所以我觉得如果是用两条数据的话,那基本所有记录都 double 了(就算是朋友这种你也需要冗余成两条数据,因为 relation 中的关系设计已经是单向了),为了保证不出现孤儿记录,维护成本会无形增加很多 所以我会在 relation 里这样设计

    user_a user_b role_a role_b
    A B father son
    A C friend friend
    class User
    
     # 定义所有的的关系,不介意性能的话,这里可以直接从数据库或缓存中取
      all_relations = %w(son father firends)
    
      all_relations.each do |role|
        define_method(role) do
          r = role.singularize
    
          relations = Relation.where(user_a: self.id, role_b: r)
                  .or(Relation.where(user_b: self.id, role_a: r))
                  .pluck(:user_a, :user_b)
          relate_ids = relations.flatten.reject{ |id| id == self.id }
    
          r == role ? User.find_by(id: relate_ids) : User.where(id: relation_ids)
        end
      end
    
    end
    
    A.son #=> B
    B.son #=> nil
    A.friends #=> [C]
    

    不过这样一来,你也就基本彻底放弃使用 Rails 原有关联的可能性了 代码我没有验证过,你就把他当伪代码看吧。这里只有一个取操作,写的操作也可以这样写

    Mongo 的话,感觉是不是会简单很多,上次用 Mongo 还是初学 Rails 的时候,已经很多不记得怎么用啦 有空我也得去补一下

  • 属性可以是不同的种类?比如 盆友 亲人 对头 …

    如果这种关系的种类是固定的,且不多,可以对每种关系当成普通的多对多来处理,比如用 has_and_belongs_to_many,由于是自关联,你需要手动指定链表表名

    如果种类不固定或数量很多,可以建一个 relation 的 model(user_a,user_b,relation)来管理这些关系。当然这样查询的时侯你需要自己处理。你可以自己封装些方法来简化查询操作,也可以使用带条件的 has_many through 来声明关联,甚至可以在 User Model 中使用一点元编程实现和 rails 多对多关联一样的调用方式,从而淡化这个 relation 的存在。

    ios 新客服端回复的,不能给你贴代码了

  • 一定是花椒吃完了

  • 1G 内存,机器上若还有其他项目跑着,真心不太够,特别是预编译静态资源的时候 不过这个也好处理,挂载一个 sawp 搞定

  • 突然想起几年前 @vincenting 造的一个 go 的验证码 他是中文数字混排简单运算的方式

    https://github.com/jianxinio/captcha

  • Ruby China 客户端 Beta 版 at 2016年09月08日

    已经用上了 灰常棒

  • Ruby China 客户端 Beta 版 at 2016年09月08日

    @huacnlee [email protected] 哈哈 昨天才卸了 老版本,正好

  • byebug rubymine 开启调试吃内存不要太凶

  • 如果这个 js 是大部分用户用不到但是又比较大的,可以不放到 application.js 里,直接在需要的页面里单独引用

    <%= javascript_include_tag 'pages' %>
    

    并且向 config 中加入

    Rails.application.config.assets.precompile += %w( pages.js)
    

    不过原则上还是建议使用 华顺 的方案,另外如果使用了 turbolinks 需要注意重载问题。

  • IChou 是的,我想换名字,不知道可不可以 注册新号 小 id 位数太壮烈

  • 如果你确实需要 user_id,user_hash 可以都存在这个表里 has_many through, 关联表本身也是一个模型

  • 关于文件权限问题 at 2016年07月20日

    你执行的是 ruby 后面的文件是个参数

  • Sidekiq 启动问题 at 2016年07月18日

    #10 楼 @u1453357893 肯定是报同样的错啊,那个参数有没有也不影响,只是你写得没意义而已 我是想提醒你 第一个参数才是 namespace,你到底是想用什么值来做 namespace 呢? 感觉你的问题是在 redis 连接这块,在 console 里面调试下 namespace 看看能用不咯

  • Sidekiq 启动问题 at 2016年07月18日

    Redis::Namespace.new 的第二参数处理里面,并没有对 :namespace 的处理,不知道你这个参数是干什么用的

    def initialize(namespace, options = {})
          @namespace = namespace
          @redis = options[:redis] || Redis.current
          @warning = !!options.fetch(:warning) do
                       !ENV['REDIS_NAMESPACE_QUIET']
                     end
          @deprecations = !!options.fetch(:deprecations) do
                            ENV['REDIS_NAMESPACE_DEPRECATIONS']
                          end
        end
    

    顺便说一下 redis: instance, :namespace => "sidekiq_redis" 这种混搭的写法,看上去很不舒服

  • Sidekiq 启动问题 at 2016年07月18日

    善用 stackoverflow 😄

  • #6 楼 @huhongda 向内网 Gem 源里添加 Gem 包太痛苦了,特别是我这种喜欢没事儿更新一下的,有没有什么解决方案

  • #4 楼 @xxqfamous 就是使用的 TCP 啊

  • #3 楼 @kikyous 一开始我遇到另一个问题的时候怀疑过线程安全问题 但是后来基本排出了,微信有时候会把同一个动作推送两次,导致出现类似线程不安全的假象

    我这边现在并不会导致服务挂掉,不过经常 puma 平滑重启的时候,进程重启了,请求却进不来。 推测是我最后提到的那种情况产生了僵死的线程,导致资源没能完全释放,这种时候就需要先 stop 再 start

    这个问题已经找到,我启用了 preload_app! ,和 phased restart 有冲突

    Note that preload_app can’t be used with phased restart, since phased restart kills and restarts workers one-by-one, and preload_app is all about copying the code of master into the workers.