• 支持一下,很靠谱的公司。

  • 跟着大师混没错的💪

  • 还清晰的记得这个问题抛出来的时候,我答非所问,失了方寸去解答时的样子。回来之后,花了一段时间才真正去解决这个问题。

    实现代码

    module Validate
    
      VALIDATE_RULES = {
        :presence => {
          :condition => /^\S+$/,
          :message => "%{name} cannot be blank"
        },
        :maxlength => {
         :condition => -> (attr, val){ attr.to_s.length <= val },
         :message => "%{name} max length is %{val}"
        }
      }
    
      def self.included(base)
        class << base; attr_accessor :defined_validates; end
        base.defined_validates = {}
        base.send(:include, InstanceMethods)
        base.extend ClassMethods
      end
    
      # def self.extended(base)
      #   class << base; attr_accessor :defined_validates; end
      #   base.defined_validates = {}
      #   base.extend ClassMethods
      #   base.send(:include, InstanceMethods)
      # end
    
      module ClassMethods
        def inherited(base)
          base.defined_validates = defined_validates.deep_dup
          super
        end
    
        def validates(name, options)
          defined_validates[name.to_s] = options
        end
      end
    
      module InstanceMethods
        def valid?
          @error_messages = {}
    
          self.class.defined_validates.each do |name, conditon|
            conditon.each do |rule, value|
              next unless value
              rule = VALIDATE_RULES[rule]
              cond = rule[:condition]
              attr_value = send(name)
    
              valid = case cond
                when Regexp
                  cond === attr_value
                when Proc
                  cond.(attr_value, value)
              end
    
              @error_messages[name] = rule[:message] % {
                name: name,
                val: value
              } unless valid
            end
          end
    
          @error_messages.size == 0
        end
    
        def error_messages
          @error_messages || {}
        end
      end
    end
    
    class User
      include Validate
      # extend Validate
      attr_accessor :name
      validates :name, :presence => true, :maxlength => 5
    
      def self.create(options = {})
        user = new.tap do |_|
          options.each do |attr, value|
            _.send("#{attr}=", value)
          end
        end
      end
    end
    
    user = User.create(:name => nil)
    user.valid?
    user.error_messages
    

    思路:

    不继承于任何类,所以只能用 include 或 extend 的方法。这里写一个 Validate 的 module,这样任何类只要 include 或 extend 它就有了 validates 的功能了。 实现: validates 是用来验证一个类的实例的,所以我们只要把 validates 的验证条件存在类的变量就可以了

    def validates(name, options)
      defined_validates[name.to_s] = options
    end
    

    这里有个类变量叫 defined_validates 通过钩子方法把我写好的方法变成了对应类的类方法和实例方法

    def self.included(base)
      class << base; attr_accessor :defined_validates; end
      base.defined_validates = {}
      base.send(:include, InstanceMethods)
      base.extend ClassMethods
    end
    

    我们把我们定义的 InstanceMethods 中的所有方法 include 了,成了实例方法 定义的 ClassMethods 中的所有方法 extend 了,成了类方法

    class << base; attr_accessor :defined_validates; end
        base.defined_validates = {}
    

    这个只要是定义类变量,就是 @@defined_validates,并且初始化,后面在 User 中我们的 validates 其实就存在这个变量中的 我们在使用 valid 的时候,再进行判断就可以了,然后再把判断结果输出到实例变量@error_messages

    无二是个好公司,自己还有很长的路要走。

  • 投了 简历写的太 low 了吧 没有面试机会😅

  • 郑州还不错,有 4 5 家 ruby 公司呢😀

  • 好嘞,我投递一下。😜

  • 好的,已投递,您看一下。

  • 想问一下可以远程进行面试吗?现在人在北京。

  • 寫 RoR 的人要求特別高? at 2018年03月01日

    会。

  • 这家公司很棒!

  • 2017 技术达人年度总结 at 2018年02月06日

    最后, 别忘记关注 "技术达人李亚飞" 公众号, 推荐给你的朋友们反思与成长.

  • Linux、Ruby 不冷没天理! at 2018年01月29日

    哈哈哈哈哈 好可爱

  • 部署后邮件发送不成功 at 2018年01月20日

    噢噢 ~

  • 部署后邮件发送不成功 at 2018年01月20日

    那就好。你前面报 TypeError, 是不是你邮件配置中的 port => :465 了?

  • 部署后邮件发送不成功 at 2018年01月20日

    在服务器上 ping 下你的邮件配置中的 address

  • 部署后邮件发送不成功 at 2018年01月20日

    domain => 'mydomain.com' 。 另外,你看下你本地环境能发吗? 自己排除下是否是网络问题。

  • 部署后邮件发送不成功 at 2018年01月20日

    把你服务器配置的 domain 贴出真实的地址,因为你现在是错的,不知道你实际配的对不对。

  • 部署后邮件发送不成功 at 2018年01月20日

    看你的日志,应该不是服务器配置的问题,你看下是否是网络问题。

  • 部署后邮件发送不成功 at 2018年01月20日

    大哥,你试下我的配置呗

  • 部署后邮件发送不成功 at 2018年01月19日

    这样配置试一下:

    config.action_mailer.raise_delivery_errors = true
      config.action_mailer.delivery_method = :smtp
      config.action_mailer.smtp_settings = {
        address:              'smtp.mxhichina.com',
        port:                 "25",
        domain:               'qiye.aliyun.com',
        user_name:           '[email protected]',
        password:             'zenmekenenggaosuni',
        authentication:       :login
      }
    
  • 你看下是不是 nginx 把样式文件当成纯文本来加载了

  • 如果你初出茅庐我们能为你提供学习锻炼的机会

    现在经验不是很长的 ruby 工程师也有面试机会吗?

  • 那时候转了 ruby 之后,在知乎回了个帖子,知乎上的回答,讲述了自己 ruby 的经历。当时对 ruby 感觉是未知,带有一点新奇,还有一丝兴奋夹杂着。因为感觉要重新开始一段 “弄懂了一个知识点,实现一个功能点,内心的状态是'兴奋的时刻'”,实际上就是如此。那时候每天都记录博客,每每完成了一个博客感觉今天过得很充实,那是做 java 之后好久没体会的感觉。怎么说呢,我总是说自己做了 3 年 java,但是感觉自己是 java 中下水平的程序员,当时我的工作只局限于 web,也没往当时比较火热的大数据方向研究。做 java 的日子里,生活过的比较清闲,早上 9 点半上班,晚上 5 点 20 下班,早上有班车,距离公司也很近,到点下班,上班期间感觉是有充足的时间去聊 QQ 的。
    直到在地铁里遇到我的一个校友。他是出来之后找 java 的工作,公司需要他们转 ruby,他就转了,从此他在 ruby 的道路上走着。遇到他之后,我就想着趁着业余时间学一学吧,因为吃完晚饭 6 点半就到家了,我就开始跟一个在 QQ 上认识的一个老师学习 ruby,跟着他的在职课程学习的,那段时光,到今天想想,还是挺美好的,也认识几个不错的 ruby 小伙伴。我觉得相对于 java 来说,首先 ruby 这个社区是个高质量的社区,起码是我遇到过的。里面有 Rei、姜军等优秀的人,社区里的其他人的思想都挺高。我还记得 Rei 在他的一篇博客上写到 “我觉得 Ruby 好的地方,是它被设计为让程序员快乐。Ruby 有很多便利的语法,但语法很容易被别的语言借鉴,唯有它的理念独树一帜。Ruby 一直让我觉得编程很快乐。”,感觉自己从此成了 Rei 粉,也想着成为他这样优秀的人。其次 ruby 与 java 相比,真的太简洁了,做 java 的时候想着我只要实现功能就好了,我只要完成任务就好了,做了 ruby 之后除了包含实现功能,还有去优化代码,让代码更加简洁,这得益于现在公司一个 10 年 ruby 的大牛的指导,跟着他学习了很多。
    我是降薪才找到了 ruby 的工作,我想着如果不转,我的人生会有遗憾,如果不行大不了重头再来呗。所以辞职之后我是没有投递 java 的岗位,直接去找的 ruby。我想着只要给个好的学习机会,我是可以放弃这一些的。转眼之间做了 ruby 也有一年多了,兴奋感减少了很多,但是还是喜欢 ruby,它不单单带给我工作中的愉悦,也点燃了我的技术热情,让我在原有工作基础上,去学习 Elixir 和 React,让我平凡的日子里过的充实、有力量。
    当时看 Rei 聊到了《黑客与画家》,我就去买了这本书。以后的我也会这样做的:“就算有一天没有公司招聘 Ruby 了,我也只会选择更强大的语言,而不是大部分人选择的语言。”

  • 前后端分裂 at 2018年01月08日
    • 没有银弹是因为前端为了分离已经做了很多年的工作,积累到了现在,分离的实现方案目前已经成熟。
    • 一但分离,实际上前端工作量比以前大很多,技术点也多很多。复杂系统必须分离,小系统可以不用 。长痛不如短痛,目前就是要处于硬分离阶段
    • 不分离就被淘汰
    • 就像楼上@easonlovewan所说的,如何在这种大趋势下用合理的工作协调方式来解决前后端的沟通成本才是重点。