Возникла проблема с Rails 2.3.4 и Ruby 1.9.1: неопределенный метод `^ ' - PullRequest
1 голос
/ 01 октября 2009

Я пытаюсь проверить, будет ли работать простой прогон приложения Rail с базой данных, и я столкнулся с проблемой.

Вот шаги, которые я предпринимаю:

> 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 в Users # index
Отображение app / views / layouts / users.html.erb, где поднята строка # 12:

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 ]

2 голосов
/ 01 октября 2009

Спасибо statenjason за ссылку на неопределенный метод `^ 'для String - RoR 2.3.4 , который предоставляет решение.

Ссылка на патч здесь .

Из этого документа я взял код и внес изменения в файл:

Библиотека / рубин / драгоценные камни / 1.9.1 / драгоценные камни / ActiveSupport-2.3.4 / Библиотека / active_support / message_verifier.rb

message_verifier.rb old 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 new 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

После внесения этого изменения проблема решена.

2 голосов
/ 01 октября 2009

Я сам должен был решить эту проблему не так давно. Патч ( Якуба не Хукла) в начале этой темы решит проблему. Обсуждение также объясняет, почему проблема существует в первую очередь, различие в поведении того, как Ruby 1.9 обрабатывает байты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...