我正在尝试测试一个带数据库的铁路应用程序的简单运行是否有效,而且我遇到了一个问题。
以下是我要采取的步骤:
> 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)
因此,从我在网上找到的,所有事情都在告诉我这应该运行。我错过了什么?
答案 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
进行此更改后,问题就解决了。