• #2 楼 @southwolf 能不能不带后缀呢??否则还是有问题的。。

  • 哦 谢谢楼上诸位们

  • ruby-china 中的 gem -- annotate at 2012年10月16日

    annotate 不是只是实现个注释的功能吗?没有实际起作用啊。。。

  • 我认为,ActionModel 实现了作为一个模型的基本功能,但是是数据库无关的。ActionRecord 则是把模型和数据库联系在了一起。

  • 呵 怎么听楼主这个意思是 用 Rails 不仅仅是敏捷,连学习都免了。我不相信会有一本讲 Rails 的教程竟然不讲如何创建 model,view,controller 的,会不讲 Rails 约定的。新手只要按部就绪的学习,又怎么可能疑惑呢? scaffold 是很不错的工具,自动生成高度提炼过的最纯粹最简单的同时由完全实现 rest 功能的代码。

  • 请教一个问题 at 2012年10月16日

    额 好吧 你已经解决了 我之前说的是数据库里 schema_migrations 这样表,migration 是由它管的

  • 请教一个问题 at 2012年10月16日

    你是不是数据库管 migration 的那张表被擦掉过了。。。

  • #15 楼 @lyfi2003 OK, 已经发 issue 了

  • #11 楼 @lyfi2003 #12 楼 @hooopo 哦 我每次试验前有意先删除 Gemfile.lock 的 之前读代码就发现这个文件会影响很多行为,所以干脆先删掉了。 然后我发现,json >= 1.7.3 和 json <= 1.7.4 不能相容,但如果是 json >= 0.4.0 和 json <= 1.7.4 是能够相容的,但如果是 json >= 0.4.1 和 json <= 1.7.4 又变成不能相容了,0.4.0 的界限真的很奇怪,于是我重点研究 0.4.0 和 0.4.1 到底区别在什么地方。 随着阅读的深入,我发现其实 resolver 的 resolve instance method 是实现检查版本冲突的核心方法,但是实现非常麻烦,循环+递归,很难调试,所以我输出了一些信息,然后瞎猜了。以下内容均势我根据输出信息的猜测: 下面要输出的是调用 resolve 方法的参数,以及里面一个排序方法在排序前和排序后的数据对比,以及排序方法的 block 里返回的数据: 下面是 json >= 0.4.1 的输出信息:

    ➜ 6  /tmp/test-project  rm Gemfile.lock; bundle install 
    rm: Gemfile.lock: No such file or directory
    fatal: Not a git repository (or any of the parent directories): .git
    fatal: Not a git repository (or any of the parent directories): .git
    Fetching gem metadata from https://rubygems.org/..
    
    
    resolve([use_json (>= 0) ruby, use_json_lower_than_1_7_4 (>= 0) ruby], {})
    reqs before sort: [use_json (>= 0) ruby, use_json_lower_than_1_7_4 (>= 0) ruby]
    use_json (>= 0) ruby => [1, 1, 1, 1]
    use_json_lower_than_1_7_4 (>= 0) ruby => [1, 1, 1, 1]
    reqs after sort: [use_json (>= 0) ruby, use_json_lower_than_1_7_4 (>= 0) ruby]
    
    
    resolve([use_json_lower_than_1_7_4 (>= 0) ruby, json (>= 0.4.1) ruby], {"use_json"=>[#<Gem::Specification name=use_json version=0.0.1>]})
    reqs before sort: [use_json_lower_than_1_7_4 (>= 0) ruby, json (>= 0.4.1) ruby]
    use_json_lower_than_1_7_4 (>= 0) ruby => [1, 1, 1, 1]
    json (>= 0.4.1) ruby => [1, 1, 1, 49]
    reqs after sort: [use_json_lower_than_1_7_4 (>= 0) ruby, json (>= 0.4.1) ruby]
    
    
    resolve([json (>= 0.4.1) ruby, json (<= 1.7.4) ruby], {"use_json"=>[#<Gem::Specification name=use_json version=0.0.1>], "use_json_lower_than_1_7_4"=>[#<Gem::Specification name=use_json_lower_than_1_7_4 version=0.0.1>]})
    reqs before sort: [json (>= 0.4.1) ruby, json (<= 1.7.4) ruby]
    json (>= 0.4.1) ruby => [1, 1, 1, 49]
    json (<= 1.7.4) ruby => [1, 1, 1, 49]
    reqs after sort: [json (>= 0.4.1) ruby, json (<= 1.7.4) ruby]
    
    
    resolve([json (<= 1.7.4) ruby], {"use_json"=>[#<Gem::Specification name=use_json version=0.0.1>], "use_json_lower_than_1_7_4"=>[#<Gem::Specification name=use_json_lower_than_1_7_4 version=0.0.1>], "json"=>[#<Gem::Specification name=json version=1.7.5>, #<Gem::Specification name=json version=1.7.5>]})
    reqs before sort: [json (<= 1.7.4) ruby]
    json (<= 1.7.4) ruby => [0, 1, 1, 0]
    reqs after sort: [json (<= 1.7.4) ruby]
    Bundler could not find compatible versions for gem "json":
      In Gemfile:
        use_json_lower_than_1_7_4 (>= 0) ruby depends on
          json (<= 1.7.4) ruby
    
        use_json (>= 0) ruby depends on
          json (1.7.5)
    

    然后是 json >= 0.4.0 的输出信息:

    ➜ 6  /tmp/test-project  rm Gemfile.lock; bundle install 
    rm: Gemfile.lock: No such file or directory
    fatal: Not a git repository (or any of the parent directories): .git
    fatal: Not a git repository (or any of the parent directories): .git
    Fetching gem metadata from https://rubygems.org/..
    
    
    resolve([use_json (>= 0) ruby, use_json_lower_than_1_7_4 (>= 0) ruby], {})
    reqs before sort: [use_json (>= 0) ruby, use_json_lower_than_1_7_4 (>= 0) ruby]
    use_json (>= 0) ruby => [1, 1, 1, 1]
    use_json_lower_than_1_7_4 (>= 0) ruby => [1, 1, 1, 1]
    reqs after sort: [use_json (>= 0) ruby, use_json_lower_than_1_7_4 (>= 0) ruby]
    
    
    resolve([use_json_lower_than_1_7_4 (>= 0) ruby, json (>= 0.4.0) ruby], {"use_json"=>[#<Gem::Specification name=use_json version=0.0.1>]})
    reqs before sort: [use_json_lower_than_1_7_4 (>= 0) ruby, json (>= 0.4.0) ruby]
    use_json_lower_than_1_7_4 (>= 0) ruby => [1, 1, 1, 1]
    json (>= 0.4.0) ruby => [1, 1, 1, 50]
    reqs after sort: [use_json_lower_than_1_7_4 (>= 0) ruby, json (>= 0.4.0) ruby]
    
    
    resolve([json (>= 0.4.0) ruby, json (<= 1.7.4) ruby], {"use_json"=>[#<Gem::Specification name=use_json version=0.0.1>], "use_json_lower_than_1_7_4"=>[#<Gem::Specification name=use_json_lower_than_1_7_4 version=0.0.1>]})
    reqs before sort: [json (>= 0.4.0) ruby, json (<= 1.7.4) ruby]
    json (>= 0.4.0) ruby => [1, 1, 1, 50]
    json (<= 1.7.4) ruby => [1, 1, 1, 49]
    reqs after sort: [json (<= 1.7.4) ruby, json (>= 0.4.0) ruby]
    
    
    resolve([json (>= 0.4.0) ruby], {"use_json"=>[#<Gem::Specification name=use_json version=0.0.1>], "use_json_lower_than_1_7_4"=>[#<Gem::Specification name=use_json_lower_than_1_7_4 version=0.0.1>], "json"=>[#<Gem::Specification name=json version=1.7.4>, #<Gem::Specification name=json version=1.7.4>]})
    reqs before sort: [json (>= 0.4.0) ruby]
    json (>= 0.4.0) ruby => [0, 1, 1, 0]
    reqs after sort: [json (>= 0.4.0) ruby]
    
    
    resolve([], {"use_json"=>[#<Gem::Specification name=use_json version=0.0.1>], "use_json_lower_than_1_7_4"=>[#<Gem::Specification name=use_json_lower_than_1_7_4 version=0.0.1>], "json"=>[#<Gem::Specification name=json version=1.7.4>, #<Gem::Specification name=json version=1.7.4>]})
    Using json (1.7.4) 
    Using use_json (0.0.1) from source at vendor/gems/use_json-0.0.1/ 
    Using use_json_lower_than_1_7_4 (0.0.1) from source at vendor/gems/use_json_lower_than_1_7_4-0.0.1/ 
    Using bundler (1.2.1) 
    Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
    

    注意它们的区别在于,如果是 json >= 0.4.0 的时候,json >= 0.4.0 在 json <= 1.7.4 之后被解析,而 json >= 0.4.1 的时候,json >= 0.4.1 在 json <= 1.7.4 之前被解析。如果 json <= 1.7.4 先被解析,则会向数组放进一个 json = 1.7.4 的 gem,这样,后来的 json >= 0.4.0 就能和它兼容了,但是如果是 json >= 0.4.1 先被解析,则数组中直接被写入了 json 的最新版本 1.7.5,这样再解析 json <= 1.7.4 的时候就会出错了。那决定解析顺序的代码是什么呢?

    reqs = reqs.sort_by do |a|
      arr = [ activated[a.name] ? 0 : 1,
        a.requirement.prerelease? ? 0 : 1,
        @errors[a.name]   ? 0 : 1,
        activated[a.name] ? 0 : @gems_size[a] ]
      puts "#{a.inspect} => #{arr.inspect}"
      arr
    end
    

    这里我拦截这个数组,输出它后再返回它(源代码里就是直接返回这个数组)。可以从上门的输出信息中看到,真正决定谁先谁后的数据是数组最后一个元素,代码是@gems_size[a],通过阅读源码,发现 gems_size 的意思是,在 source 中符合这个 gem 要求的 gem 数量,在 rubygems.org 中,json >= 0.4.0 的 gem 有 50 个,json >= 0.4.1 的 gem 有 49 个,而 gem <= 1.7.4 的 gem 也是 49 个,由于 json >= 0.4.1 的 gem 数量等于 gem <= 1.7.4 的 gem 数量,在排序时没有优势,因此 json >= 0.4.1 先解析,然后出错了。而 json >= 0.4.0 的 gem 数量比 json <= 1.7.4 的 gem 数量多 1,在排序时有优势,所以后者前解析,成功。 这里最让人无语的是,source 里符合要求的 gem 数量竟然能影响 GemBundler 解决版本冲突的因素之一。我现在不知道该如何评论了。。。大家看看把??

  • #9 楼 @leekelby 不是啊 不能在 Gemfile 里定义两个名字相同版本号不同的 gem,也不能定义两个名字相同但是源不同的 gem,这个特性是显而易见的,而且在一个 Gemfile 里显式的声明两个名字相同的 gem 本身就是蛋疼行为,和我的问题无关。

    # if there's already a dependency with this name we try to prefer one
    if current = @dependencies.find { |d| d.name == dep.name }
      if current.requirement != dep.requirement
        if current.type == :development
          @dependencies.delete current
        elsif dep.type == :development
          return
        else
          raise DslError, "You cannot specify the same gem twice with different version requirements. " \
                          "You specified: #{current.name} (#{current.requirement}) and " \
                          "#{dep.name} (#{dep.requirement})"
        end
      end
    
      if current.source != dep.source
        if current.type == :development
          @dependencies.delete current
        elsif dep.type == :development
          return
        else
          raise DslError, "You cannot specify the same gem twice coming from different sources. You " \
                          "specified that #{dep.name} (#{dep.requirement}) should come from " \
                          "#{current.source || 'an unspecified source'} and #{dep.source}"
        end
      end
    end
    
  • 再用一个 sqlite 差不多了

  • #5 楼 @cxh116 不是啊 我要求 json >= 1.7.3 && json <= 1.7.4,这个不是空集啊。

  • #4 楼 @5long 哎 都已经试过了 我现在在看 GemBundler 检测冲突的代码 希望能从里面发现问题

  • #3 楼 @lyfi2003 额 你“>=x.x.x +1”那个+1 是哪里来的呢?

  • #1 楼 @5long 不行啊 还是不能解决

  • 你 Clone 下什么项目拉?Linux Kernel 吗?

  • 我对 CanCan 的理解 at 2012年10月13日

    可以 我当初成功实现过

  • #1 楼 @aston 这个方法好 谢谢!

  • 新手困惑,求解答。 at 2012年10月12日

    Ruby 方法名里允许有!? =等符号

  • Great!

  • ruby 如何实现连减 at 2012年10月12日

    [1,2,3,4,5].inject(0) { |s, a| s - a } 这样?不过如果初始值是 0 的话计算结果是 -15,不是 -13

  • 关于 String 的 replace 问题 at 2012年10月11日

    这问题不错啊 我也从没用过 replace 方法,甚至不知道这个方法的存在 只知道 Ruby 使用 sub 和 gsub 做替换的

  • #29 楼 @lgn21st 是啊

  • Rails Girls 男生能参加吗? at 2012年10月11日

    我们公司有不少 Ruby Lady 能去吗?

  • #22 楼 @lgn21st 上传功能有点问题嘛 错误消息:POST http://ruby-china.org/photos 413 (Request Entity Too Large) 所以上传到https://plus.google.com/photos/114136340908879366522/albums/5797619732471044049 了,也就两张照片而已

  • 女程序员 Github 求偶? at 2012年10月09日

    略矮

  • 应该能参加~

  • #19 楼 @5long 其实我觉得 文档不是给上面人看的 更不是给机器人看的 而是给将来的新人看的 我当初接手我现在的项目的时候 文档非常匮乏 项目中其他人也是新接手这个项目的 很多功能都完全不知道 做新功能的时候导致以前很多比较隐蔽的功能出了问题 所以我一直觉得在给新功能写测试的时候顺便写下文档是个很好的习惯,防止以后接手的新人犯下同样的错误

  • #1 楼 @5long scenario outline 是测试中运用十分广泛的功能,感觉如果用 Rspec 写就会很难看的说

  • #11 楼 @Rei 没这么简单啊,我想要升级 Rails 版本,我就希望做高代码覆盖率的测试,否则根本难以想象哪个功能会出问题