NameError: неинициализированная константа User :: SCREEN_NAME_RANGE - PullRequest
0 голосов
/ 28 августа 2011

Итак, в соответствии с руководством по Railsspace, я предполагаю использовать консоль для понимания Active Records.Так что я делаю то, что говорят, что я должен делать, и это результат, который я получаю.

Кто-нибудь знает, где проблема?

   $ rails console

Вывод

Loading development environment (Rails 3.0.10)
ruby-1.9.2-p290 :001 > user = User.new(:screen_name => "me",
ruby-1.9.2-p290 :002 >     :email => "",
ruby-1.9.2-p290 :003 >     :password => "a",)
NameError: uninitialized constant User::SCREEN_NAME_RANGE
    from /Users/dennisbuizert/Sites/gpoff/app/models/user.rb:3:in `<class:User>'
    from /Users/dennisbuizert/Sites/gpoff/app/models/user.rb:1:in `<top (required)>'
    from (irb):1
    from /Users/dennisbuizert/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands/console.rb:44:in `start'
    from /Users/dennisbuizert/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands/console.rb:8:in `start'
    from /Users/dennisbuizert/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands.rb:23:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

Модель пользователя

    class User < ActiveRecord::Base
  validates_uniqueness_of :screen_name, :email
  validates_length_of     :screen_name, :within => SCREEN_NAME_RANGE
  validates_length_of     :password,    :within => PASSWORD_RANGE
  validates_length_of     :email,       :maximum => EMAIL_MAX_LENGTH
  validates_presence_of   :email

  # Max & Min length for all fields
  SCREEN_NAME_MIN_LENGTH  = 3
  SCREEN_NAME_MAX_LENGTH  = 20
  PASSWORD_MIN_LENGTH     = 8
  PASSWORD_MAX_LENGTH     = 26
  EMAIL_MAX_LENGTH        = 50
  SCREEN_NAME_RANGE = SCREEN_NAME_MIN_LENGHT..SCREEN_NAME_MAX_LENGTH
  PASSWORD_RANGE = PASSWORD_MIN_LENGHT..PASSWORD_MAX_LENGTH

end

Я использую SQLite3, а не MySQL, потому что не могу понять, как заменить SQLite3 на mysql икак заставить это работать.

Ответы [ 3 ]

4 голосов
/ 28 августа 2011

Я вижу, откуда исходит ошибка. Вы должны объявить свои константы до подтверждения. Когда класс загружен, константа, на которую вы ссылаетесь в своей валидации, еще не объявлена, поэтому возникает ошибка.

Ваш код должен выглядеть следующим образом:

class User < ActiveRecord::Base

  # Max & Min length for all fields
  SCREEN_NAME_MIN_LENGTH  = 3
  SCREEN_NAME_MAX_LENGTH  = 20
  PASSWORD_MIN_LENGTH     = 8
  PASSWORD_MAX_LENGTH     = 26
  EMAIL_MAX_LENGTH        = 50
  SCREEN_NAME_RANGE = SCREEN_NAME_MIN_LENGHT..SCREEN_NAME_MAX_LENGTH
  PASSWORD_RANGE = PASSWORD_MIN_LENGHT..PASSWORD_MAX_LENGTH

  validates_uniqueness_of :screen_name, :email
  validates_length_of     :screen_name, :within => SCREEN_NAME_RANGE
  validates_length_of     :password,    :within => PASSWORD_RANGE
  validates_length_of     :email,       :maximum => EMAIL_MAX_LENGTH
  validates_presence_of   :email

end
0 голосов
/ 23 марта 2012

эта проблема возникает при редактировании файлов модели во время выполнения автотеста

Так что просто остановите автотест, затем запустите его снова (если хотите)

0 голосов
/ 28 августа 2011

Чтобы заставить работать sqlite, убедитесь, что в вашем Gemfile есть строка gem sqlite3, запустите bundle install, и ваши секции в config/database.yml будут выглядеть примерно так:

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

Что касается ошибки SCREEN_NAME_RANGE, я не могу сказать, откуда это происходит, не увидев ваш код (при условии, что указанные выше изменения конфигурации не исправляют это). Если вы абсолютно уверены, что ваши файлы точно такие же, как они показаны в руководстве, я бы связался с автором, поскольку это несвободный набор документов.

Возможно, вы захотите проверить http://guides.rubyonrails.org/. У них есть большие предупреждения, что они неполные, но по большей части они довольно хорошо написаны (и публично активными участниками сообщества) и бесплатны.

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