遇到Rails 2.3.4和Ruby 1.9.1的问题:未定义的方法`^'

时间:2009-10-01 02:07:38

标签: ruby-on-rails

我正在尝试测试一个带数据库的铁路应用程序的简单运行是否有效,而且我遇到了一个问题。

以下是我要采取的步骤:

> mkdir MyApp
> cd MyApp
> rails myapp
  ...
> rake db:create
  ...
> ruby script/generate scaffold user first_name:string last_name:string active:boolean
  ...
> rake db:migrate
  ...
> ruby script/server
  ...    

从这里开始,我第一次打开http://localhost:3000/users页面将会打开,然后点击“新用户”。然后我收到了这个错误:

用户中的NoMethodError #index
显示第12行引出的app / views / layouts / users.html.erb:

undefined method `^' for "7":String

RAILS_ROOT:/ Users / lillq / MyApp

/usr/local/lib/ruby/gems/1.9.1/gems/activesupport-2.3.4/lib/active_support/message_verifier.rb:46:in `block in secure_compare'
/usr/local/lib/ruby/gems/1.9.1/gems/activesupport-2.3.4/lib/active_support/message_verifier.rb:45:in `each'
... 
/usr/local/lib/ruby/gems/1.9.1/gems/actionpack-2.3.4/lib/action_view/base.rb:197:in `flash'
/Users/lillq/MyApp/app/views/layouts/users.html.erb:12:in `_run_erb_app47views47layouts47users46html46erb'
/Users/lillq/MyApp/app/controllers/users_controller.rb:7:in `index'

所以,首先我认为版本可能不兼容,但有几个问题表明1.9.1和rails兼容。

两者都说Rail和Ruby 1.9应该可以工作。

以下是我正在运行的版本:

lillq:~/MyApp > ruby --version
ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-darwin10.0.0]
lillq:~/MyApp > gem --version
1.3.5
lillq:~/MyApp > gem list

*** LOCAL GEMS ***

actionmailer (2.3.4)
actionpack (2.3.4)
activerecord (2.3.4)
activeresource (2.3.4)
activesupport (2.3.4)
mysql (2.8.1)
rack (1.0.0)
rails (2.3.4)
rake (0.8.7)
sqlite3-ruby (1.2.5)

因此,从我在网上找到的,所有事情都在告诉我这应该运行。我错过了什么?

2 个答案:

答案 0 :(得分:2)

我不得不在不久前解决这个问题。 this thread 开头的补丁( Jakub的不是hukl's)将解决问题。讨论还解释了为什么问题首先存在,Ruby 1.9如何处理字节的行为不同。

答案 1 :(得分:2)

感谢statenjason链接到提供解决方案的undefined method `^' for String - RoR 2.3.4

补丁的链接是here

从这份文件中我拿了代码并对文件进行了更改:

<强> LIB /红宝石/宝石/ 1.9.1 /宝石/的ActiveSupport-2.3.4 / LIB / active_support / message_verifier.rb

message_verifier.rb secure_compare:

  def secure_compare(a, b)
    if a.length == b.length
      result = 0
      for i in 0..(a.length - 1)
        result |= a[i] ^ b[i]
      end
      result == 0
    else
      false
    end
  end

message_verifier.rb secure_compare:

  def secure_compare(a, b)
    if a.respond_to?(:bytesize)
      # > 1.8.6 friendly version
      if a.bytesize == b.bytesize
        result = 0
        j = b.each_byte
        a.each_byte { |i| result |= i ^ j.next }
        result == 0
      else
        false
      end
    else
      # <= 1.8.6 friendly version
      if a.size == b.size
        result = 0
        for i in 0..(a.length - 1)
          result |= a[i] ^ b[i]
        end
        result == 0
      else
        false
      end
    end
  end

进行此更改后,问题就解决了。