Неопределенный метод для модели с Ruby on Rails и MongoDB? - PullRequest
1 голос
/ 08 ноября 2011

Я начинаю работать с базами данных не-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-z\d\-.]+\.[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...)

Ответы [ 2 ]

3 голосов
/ 08 ноября 2011

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

#<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 голос
/ 29 мая 2012

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

...