undefined метод 'delete' для String: Класс при использовании Mongoid и создании записей через консоль - PullRequest
1 голос
/ 21 ноября 2011

У меня есть класс, который выглядит так:

class SearchService
  include Mongoid::Document

  key :name, String
  field :url, String
  field :searchBaseUrl, String

  validates_presence_of :name, :url, :searchBaseUrl
  validates_uniqueness_of :name 
end

Первая проблема заключается в том, что я использовал validates_presence_of неправильно, или так может показаться. Я прокомментировал строку, и я мог создать экземпляр класса на консоли без проблем. Но когда я попытался создать объект с validates_presence_of на месте, я получил ошибку:

NoMethodError: undefined method `delete' for String:Class
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/mongoid-2.3.3/lib/mongoid/fields.rb:230:in `add_field'
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/mongoid-2.3.3/lib/mongoid/fields.rb:145:in `field'

Является ли это сообщение об ошибке значимым? Мне трудно увидеть взаимосвязь между отсутствующим методом в классе String и тем, что я неправильно использую validates_presence_of. Если бы я мог выбрать только одну вещь в Ruby, которая меня беспокоит, это были бы ужасные сообщения об ошибках.

Документы rails говорят, что validates_presence_of предназначен для ассоциации. Но на странице mongo db написано, что она используется для обязательных полей. Документы mongodb неверны?

Я пытаюсь решить, является ли это проблемой, о которой я должен сообщить команде mongoid, или я просто не понимаю, как работает язык.

Обновление : ОК, теперь я получаю очень похожую ошибку в классе, который вообще не использует validates_presence_of. Так что это какая-то другая проблема (хотя комментирование этой строки исправило ее изначально).

Update2 : Мне кажется, это ошибка в mongoid. Изменение этой строки:

field :name в field :name, String

приведет к появлению ошибки. Кажется, что любое поле, определенное с типом, испортит mongoid. Или их там больше не должно быть? Документы mongodb (см. Ссылку выше) имеют код, который выглядит как key :votes, Integer, :default => 0, поэтому, если он недействителен, документы не верны.

Rails 3.1.1, Ruby 1.9.3

Ответы [ 3 ]

4 голосов
/ 21 ноября 2011

Вы используете неверный синтаксис для определения типа поля. Следует использовать параметры hash и ключ «type». Пример из документации http://mongoid.org/

class Artist
  include Mongoid::Document
  field :name, type: String
  embeds_many :instruments
end

Вы ссылаетесь на примеры MongoMapper, но используете Mongoid))

2 голосов
/ 22 ноября 2011

jcollum, проблема в том, что вы используете mongoid, но примеры на mongodb.org используют mongomapper.

Имейте в виду, что это разные ODM для рельсов и несколько различный синтаксис для определения полей.

Пожалуйста, смотрите документацию здесь для монгоида.

Формат полей с использованием mongoid:

class Person
    include Mongoid::Document
    field :first_name, type: String
    field :middle_name, type: String
    field :last_name, type: String
end
0 голосов
/ 21 ноября 2011

В Rails 3 вы должны использовать проверки нового стиля :

validates :name, :presence => true, :uniqueness => true
validates :url, :presence => true
validates :searchBaseUrl, :presence => true

Используйте with_options, чтобы сделать СУХОЙ

with_options :presence => true do |v|
  v.validates :name, :uniqueness => true
  v.validates :url
  v.validates :searchBaseUrl
end
...