• 之前 1.9.3-p0 的时候试过这个补丁,效果很显著,但不敢在生产环境用,不知道有没有副作用……

    另外很好奇,为什么每个版本的 ruby 都能冒出来一个鸡血补丁,这优化空间有这么大么??

  • 如何让 scope 可以携带参数 at 2012年03月30日

    #3 楼 @kevinhua

    我看到这个问题之后,打开 api.rubyonrails.org,搜索 scope,马上看到答案了,但由于那个页面是框架包着的,复制不到那个页面链接,所以就直接回了一句“看文档”,因为 Rails 只有两份文档:http://api.rubyonrails.org/http://guides.rubyonrails.org/,一个有目录,一个有搜索框,找起来并不难,这样的回答,不算偷懒吧?

    #25 楼 @lgn21st 我翻了下 scope 方法的源码,我的理解是它把传入的 proc 定义成 model 的一个 class method 了?

    # File activerecord/lib/active_record/scoping/named.rb, line 174
    def scope(name, scope_options = {})
      # 略去部分代码
      scope_proc = lambda do |*args|
        options = scope_options.respond_to?(:call) ? unscoped { scope_options.call(*args) } : scope_options
        # 略去部分代码
      end
      singleton_class.send(:redefine_method, name, &scope_proc) # 注意 redefine_method 的使用
    end
    
    
  • 大家外语能力如何? at 2012年03月30日

    四级 655,六级 605. 高中就开始看英文技术书了,偶尔还会在英文邮件列表(comp.lang.c comp.lang.python)上讨论问题。

    主要得益于我们高中的强悍的英语训练(高二的时候老师就拿四级的题给我们做练习)(另外身边那些 TOEFL/SAT 党的耳濡目染也很重要)

  • 如何让 scope 可以携带参数 at 2012年03月30日

    看文档……

  • #1 楼 @huacnlee 可是我在本地测试的时候没有问题(development 和 production 环境都测试过),本地跟服务器的环境应该只有操作系统不同……

  • 今天更新了 carrierwave-upyun 的版本到 0.1.5,发现 @nowa 已经修复了这个功能~不过这次我发现了又拍云 API 的一个小问题:

    1. 通过 http://bitbucket-name.b0.upaiyun.com/file-path 访问图片文件时,content-type 正常,比如 image/jpeg

    2. 通过 http://v0.api.upyun.com/bitbucket-name/file-path 访问图片文件时,content-type 总是会返回 text/html,导致调用 recreate_versions! 重新上传图片文件时会把原先的 content-type 覆盖掉,在浏览器里访问图片文件会显示一堆乱码

    话说我在又拍云的网站上找不到提交 ticket 的地方,联系客服貌似还要预约!?目前暂时的解决访问是 monkey-path 掉 CarrierWave::Storage::Upyun::File#content_type 这个方法:

    class CarrierWave::Storage::UpYun::File 
      def content_type
        'image/jpeg' # 我们会把所有图片都转成 jpg...
      end  
    end
    
    
  • #6 楼 @hbin 我只是没在 README 里写而已,目录里那个 starter-kit 是谁都能看到的吧,确实是 copy 的,我也没说是原创的,何来出卖一说……

  • #8 楼 @anklos 只是一种代码风格吧,在代码逻辑上是没有问题的。另外 5 楼那个方法最后也是要处理 NameError 异常的。

  • 之前配了一个 Emacs 的 Rails 环境,不过用了几个星期觉得不爽,又继续用 Vim 了。Emacs 主要是 elisp 写起来很好玩,有兴趣看看: http://github.com/iwinux/emacs-config

  • @anklos 我觉得你的这个函数是最简单的实现,已经够用了,如果觉得 eval 不好看,换成这样试试:

    # 不要叫 present?,会跟 Object#present? 重名
    class String
      def has_defined_class?
        begin
          !!self.classify.constantize
        rescue NameError
          false
        end
      end
    end
    
    'not_exist_class'.has_defined_class? # => false
    'integer'.has_defined_class? # => true
    
    
  • Model.validators

    这种问题其实只要开个 rails c 敲几个字母 TAB 几下就会找到答案的吧……要不翻源码也行……

  • #4 楼 @Rei 你觉得 Octopress 缺的是什么东西~正好我最近打算改造一下它

  • #1 楼 @huacnlee 原来是这样……那我有空把它补上好了 =。=

  • #2 楼 @huobazi 又拍云提供的缩略方式不符合我们的要求(比如 resize_and_pad ——按原图比例缩小到指定尺寸范围,空白的地方就用黑色填充)

  • #3 楼 @jokry and #4 楼 @clc3123

    有两种情况需要写代码注释:

    1. 这段代码提供的是公共的 API(主要介绍用法,参数,返回值什么的)
    2. 代码的逻辑无法一眼看懂

    以 Rails 的一段代码为例(来自 active_support/core_ext/array/grouping.rb)

    # Splits or iterates over the array in groups of size +number+,
    # padding any remaining slots with +fill_with+ unless it is +false+.
    #
    #   %w(1 2 3 4 5 6 7).in_groups_of(3) {|group| p group}
    #   ["1", "2", "3"]
    #  省略部分内容....
    
    def in_groups_of(number, fill_with = nil)
      if fill_with == false
        collection = self
      else
        # size % number gives how many extra we have;
        # subtracting from number gives how many to add;
        # modulo number ensures we don't add group of just fill.
        padding = (number - size % number) % number
        collection = dup.concat([fill_with] * padding)
      end
      # 省略部分代码
    end
    
    

    最上方的注释属于第一类,中间部分的注释则是第二类。像 ruby-china 这种项目,本身没有提供什么公共模块,也不涉及特别复杂的逻辑,注释少是比较正常的吧~~

    #5 楼 @Rei

    TomDoc 这只是个注释风格约定么?

  • The new Basecamp has launched! at 2012年03月08日

    #8 楼 @cqpx pushState 方面的功能貌似 History.js 封装得比较好。

  • 我来跑个题……没有人围观 1 楼么 >。<

  • def respond_to?(message)
      message = message.to_sym
      [:__result__, :inspect].include?(message) ||
        __result__.respond_to?(message)
    end
    
    

    最后那个 respond_to? 加上括号就好了。

  • 你是 vim 党还是 emacs 党? at 2012年03月06日

    Vim 党和 Emacs 党都弱爆了,我在 Emacs 里用 evil-mode(几乎完美模拟 Vim 按键)XDDDD

    (举牌,这是笑话……)

  • 貌似我用了 Rails 那么久一直都是用 attr_accessible,没有用过 attr_protected(我是看 Ruby on Rails Tutorial 这本书入门的,对我的编码风格影响很大)

  • #5 楼 @huacnlee 我在 Django 里模仿 Rails 写了个 mass-assignment 的东西,现在有点担心会不会有漏洞 = =

    class BaseModel(db.Model):
        protected_fields = []
    
        def to_dict(self):
            keys = self.fields().keys()
            _dict = {}
    
            for key in keys:
                _dict[key] = getattr(self, key)
    
            return _dict
    
        def from_dict(self, _dict):
            for field in self.protected_fields:
                if field in _dict:
                    del _dict[field]
    
            for key, value in _dict.iteritems():
                setattr(self, key, value)
            self.put()
    
    
  • #1 楼 @vkill 除了 404 500,“其他异常”包括哪些异常呢?我要怎么确定自己没有漏掉一部分呢……

  • #3 楼 @huacnlee //l.ruby-china.com/ 这是直接指向又拍云的?还是主机上的反向代理?

  • 目前最不爽的就是 Rails 的启动速度

  • #7 楼 @LarryLv 如果有很多 model 都需要实现这个功能,就自己写一个 acts_as_series 咯

  • 菜鸟继续发问,问问&block at 2012年02月27日

    请参考 The Ruby Programming Language Chapter 6.4.5 Block Arguments

  • 部署到生产模式的问题 at 2012年02月27日

    #8 楼 @yfeng 你部署的步骤是怎样的?正常的应该是这样:

    1. rake assets:precompile
    2. rails -e production

    你看看 public/assets 里有没有 style.css 这个文件。

  • #3 楼 @camel 实验结果:

    
    [2] pry(main)> class Test
    [2] pry(main)*   %w(method_a method_b method_c).each do |name|
    [2] pry(main)*     define_method name do
    [2] pry(main)*       puts "I'm in method #{name}"
    [2] pry(main)*     end  
    [2] pry(main)*   end  
    [2] pry(main)* end  
    => ["method_a", "method_b", "method_c"]
    [3] pry(main)> Test.new.respond_to? :method_a
    => true
    [4] pry(main)> Test.new.respond_to? :method_b
    => true
    [5] pry(main)> Test.new.respond_to? :method_c
    => true
    [6] pry(main)> show-source Test.new.meth
    Test.new.method           Test.new.method_c         Test.new.methods          
    Test.new.method_a         Test.new.method_defined?  Test.new.meths            
    Test.new.method_b         Test.new.method_missing   Test.new.meths=           
    [6] pry(main)> show-source Test.new.method_a
    
    From: (pry) @ line 3:
    Number of lines: 3
    Owner: Test
    Visibility: public
    
    define_method name do
      puts "I'm in method #{name}"
    end
    [7] pry(main)>