• 为什么有这样的结论?函数名就是变量啊

  • 他们直接抛弃了 RESTful

    应该是业务目前还够简单, controller 还没成长为裹脚布

  • 这不只是 Rails 的问题吧,现在的『全栈框架』部署起来差不多都这个样子,毕竟涉及的东西就有这么多

    其实也没有多复杂,只是楼主可能没有仔细去看 Rails 部署相关的文章,走了很多弯路

    社区缺一篇相关的 Wiki 倒是真的

  • 推荐开源的 Ruby 学习书籍 at 2018年09月05日

    第一本的发布日期就是 Mar 16, 2010,这还是发布时间,编写时间可能更早

    Ruby 跨了大版本的书对新人来说除了添乱,几乎一点帮助都没有

  • @ad583255925 请告诉我 对方是不是 java

  • 推荐开源的 Ruby 学习书籍 at 2018年09月05日

    9年前写的书还发 这不是坑人么 @huacnlee

  • 看了下源码,如果没有 undef_method :name 就如你说的,会在第一调用的时候生成各种方法追加到 User 的实例方法中去,这个时候你调用 user.name 是不会触发 method_missing 的

    现在来说你 undef_method :name 的情况,首先它会落入下面的 method_missing 方法中

    # lib/active_model/attribute_methods.rb:425
    
    def method_missing(method, *args, &block)
      if respond_to_without_attributes?(method, true) # =>  这里是 false
        super
      else
        match = matched_attribute_method(method.to_s)
        #<struct ActiveModel::AttributeMethods::ClassMethods::AttributeMethodMatcher::AttributeMethodMatch target="attribute", attr_name="name", method_name="name">
        match ? attribute_missing(match, *args, &block) : super
      end
    end
    
    def attribute_missing(match, *args, &block)
      __send__(match.target, match.attr_name, *args, &block)
      # match.target => "attribute", 这里调用了自身的 attribute 方法
    end
    
    # lib/active_record/attribute_methods/read.rb:76
    def _read_attribute(attr_name) # :nodoc:
      @attributes.fetch_value(attr_name.to_s) { |n| yield n if block_given? }
    end
    alias :attribute :_read_attribute
    private :attribute
    

    这下明白了吧

  • 没去看源码 做了个小实验

    class User < ActiveRecord
    end
    
    User.instance_methods.include?(:name) #=> false
    user = User.new
    User.instance_methods.include?(:name) #=> true
    
    user[:name] = 'admin'
    
    User.class_eval %q{undef_method :name}
    User.instance_methods.include?(:name) #=> false
    user.methods.include?(:name) #=> false
    user.name #=> "admin"
    

    看上去 attributes 的 methods 是懒加载的,只有在调用相关内容的时候才添加到 Class 里面,而且就算你把它从类里面 undef 掉,当你在实例上调用它时,它依旧会通过 method_missing 的 fallback 表现出正常的行为,应该算一种安全机制吧

  • 最粗暴的 在 nginx 代理转发的时候改

    另外给路由指定 format: :json 能应对你们的情况么

  • nginx 的 root 目录应该指向 public 而不是根目录

    原则上 app 目录下的资源是不允许直接被 nginx 访问的,不需要 assets pipeline 管理的静态文件应该直接放到 public 目录下面去