Неопределенный метод для модели с Ruby on Rails и MongoDB?

#ruby-on-rails #mongodb #model #mongomapper

#ruby-on-rails #mongodb #Модель #mongomapper

Вопрос:

Я начинаю работу с базой данных, отличной от SQL (в частности, MongoDB) и Ruby on Rails, потому что я считаю, что гибкие схемы будут преимуществом. Прямо сейчас я в замешательстве, потому что некоторые вещи, которые я ожидаю «просто работать», не работают. В частности, у меня ошибка «метод отсутствует» на одной из моих страниц.

 NoMethodError in Users#new

undefined method `email' for #<User _id: BSON::ObjectId('4eb8cbcaef704c02da000017')>

Extracted source (around line #13):

10:       <tbody><tr>
11:         <td><%= f.label :email %>:</td>
12:         <td>
13:           <%= f.text_field :email, :placeholder => "your email address" %>
14:         </td>
15:       </tr>
16:       <tr>
  

В консоли:

 >> User.new.email
NoMethodError: undefined method `email' for #<User _id: BSON::ObjectId('4eb8cc4def704c0358000005')>
    from /Library/Ruby/Gems/1.8/gems/activemodel-3.1.1/lib/active_model/attribute_methods.rb:385:in `method_missing'
    from (irb):5
  

Модель выглядит следующим образом: (обратите внимание, что класс User не наследуется ни от какого суперкласса Active Record … имеет ли это значение?)

 class User
  include MongoMapper::Document

  attr_accessor :password
  attr_accessible :username, :email, :password

  email_regex = /A[w -.] @[a-zd-.] .[a-z] z/i

  validates :username, :presence => true,
                   :format => { :with => /^[a-zA-Z][a-zA-Z0-9_] $/ },
                   :length => { :maximum => 32, :minimum => 4 }
  validates :email, :presence => true,
                    :format => { :with => email_regex },
                    :uniqueness => { :case_sensitive => false }
  validates :password, :presence => true,
                       :length => { :within => 5..32 },
                       :confirmation => true
  (etc...)
  

Ответ №1:

Если вы посмотрите на сообщения об ошибках, вы увидите такие вещи, как это:

 #<User _id: BSON::ObjectId('4eb8cc4def704c0358000005')>
  

итак, ваши модели, поддерживаемые MongoMapper, имеют только свойство по умолчанию _id . Вам нужно будет сообщить MongoMapper, каковы другие свойства:

 class User
  include MongoMapper::Document

  key :password, String
  key :username, String
  key :email, String
  #...
  

С документацией MongoMapper может быть сложно ориентироваться, но важные моменты там есть.

Итак, MongoMapper использует своего рода схемы.

Комментарии:

1. Извините, но я не могу найти это в документации. Означает ли это, что каждый атрибут, который я хочу иметь, является ключом? Индексируются ли ключи? Например, у меня есть атрибут:salt, который не должен индексироваться. (: пароль также не должен индексироваться …) Это все ключи?

2. @Dave: key просто означает «свойство», оно похоже на attr_accessor , но сообщает MongoMapper, что свойство будет сохранено в коллекции MongoDB; терминология плохая, поскольку «ключи» похожи на «столбцы» или «поля» в реляционной системе. Индексирование выполняется с помощью ensure_index . Смотрите страницу ключей и страницу индексов в документах для получения дополнительной информации.

3. MongoDB желает, чтобы он мог работать так же хорошо, как мозг mu is too short.

Ответ №2:

ваша проблема в том, что с командой «User.new.email» вы пытаетесь использовать метод с именем «email», но я думаю, что email — это атрибут, а не метод