Как получить сообщения проверки от mangomapper с помощью консоли rails? - PullRequest
0 голосов
/ 13 января 2011

Я учу себя, как использовать RoR и MongoDB одновременно.Я следую очень хорошей книге / учебнику: http://railstutorial.org/

Я решил заменить Sqlite3 на MongoDB, используя гем mongomapper.Все работает хорошо, но у меня есть некоторые неблокирующие небольшие проблемы, от которых я действительно хотел бы избавиться.

В главе 6 при работе с проверкой у меня возникли 2 проблемы:знать, как вернуть сообщения проверки, как с Sqlite3.

"Стандартный" код:

$ rails console --sandbox
>> user = User.new(:name => "", :email => "mhartl@example.com")
>> user.save
=> false
>> user.valid?
=> false
>> user.errors.full_messages
=> ["Name can't be blank"]

, но если я пытаюсь сделать то же самое с MongoMapper, выдается сообщение об ошибкеэта ошибка является неопределенной функцией.Значит ли это, что это просто не реализовано в драйвере mongomapper / mongo?Или есть какой-то другой умный способ сделать это, что я не мог понять?

Дополнительно, 2 вещи здесь: - Я следую за примером в книге к строке, поэтому я ожидал, что смогу использоватьконсоль в режиме песочницы, но, видимо, это тоже не работает:

(...)ruby-1.9.2-p136@rails3/gems/railties-3.0.3/lib/rails/console/sandbox.rb:1:in `<top (required)>': uninitialized constant ActiveRecord (NameError)
from /Users/Alex/.rvm/gems/ruby-1.9.2-p136@rails3/gems/railties-3.0.3/lib/rails/application.rb:226:in `initialize_console'
from /Users/Alex/.rvm/gems/ruby-1.9.2-p136@rails3/gems/railties-3.0.3/lib/rails/application.rb:153:in `load_console'
from /Users/Alex/.rvm/gems/ruby-1.9.2-p136@rails3/gems/railties-3.0.3/lib/rails/commands/console.rb:26:in `start'
from /Users/Alex/.rvm/gems/ruby-1.9.2-p136@rails3/gems/railties-3.0.3/lib/rails/commands/console.rb:8:in `start'
from /Users/Alex/.rvm/gems/ruby-1.9.2-p136@rails3/gems/railties-3.0.3/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'

Кроме того, в книге они называют «пользователь», но мне нужно вызвать «Пользователь» (обратите внимание на заглавную U), почему это так?Это похоже на то, что mangomapper не следует соглашению об именах Ruby или что-то в этом роде?

И, наконец, я пытаюсь проверить электронную почту поля с помощью регулярного выражения, как показано в руководстве.Он не выдает никаких ошибок в коде, но всякий раз, когда я пытаюсь вставить его, он просто не принимает его, пока я не закомментирую параметр: format ...

class User
  include MongoMapper::Document   

key :name, String, :required => true,
                   :length => { :maximum => 50 }

key :email, String, :required => true,
#                   :format => { :with => email_regex },
                    :uniqueness => { :case_sentitive => false}

timestamps!

end

Любые советы, которые вы можете предоставитьэти темы мне очень помогут!

Спасибо,

Алекс

Ответы [ 3 ]

0 голосов
/ 13 января 2011

Что ж, благодаря напоминанию Стефа о разнице между классом и экземпляром объекта (Дух!), Я понял, что слишком быстро прочитал это:)

С самого начала я пытался вывести методымоего класса, а не экземпляра объекта.

Так что теперь я могу полностью получить user.errors.full_messages правильно ...

, что помогает с проверкой :) И, надеюсь, благодаря этому ясмогу отсортировать проверку регулярных выражений!

Alex

0 голосов
/ 13 января 2011

Хорошо, у меня возникла проблема с проверкой (с исправленной электронной почтой).

Этот код будет работать, как и ожидалось:

email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

key :name, String, :length => { :maximum => 50 }
key :email, String  
timestamps!

validates_presence_of :name, :email

validates_uniqueness_of :email, :case_sensitive => false 

validates_format_of :email, :with =>email_regex

Мне было трудно разобраться, что именно будет работатьи что бы не ... потому что, если я не знаю, как использовать Google больше, это нигде не задокументировано полностью.Вы можете найти некоторую часть информации на слайдах, GitHub, группе Google и т. Д., Касающуюся mongomapper.

Не поймите меня неправильно, я люблю mongomapper и работу, проделанную Джоном, но теперь процесс проверкиэто немного грязно ... часть его все еще использует "старые" системы 2.x rails, а другая часть использует новую нотацию 3.x rails ...

Мне нравится новая нотация 3.xнамного лучше, потому что это позволяет вам централизовать все условия проверки вокруг вашего поля в одном месте.Как пример: length => {: максимум => 50} выше.Но чтобы получить правильную уникальность и формат, мне пришлось использовать методы validates_xxxx вне объявления key .Смешивать оба стиля немного раздражает.

Наконец, я хотел бы найти официальное документированное описание всех возможных проверок, которые бы мне очень помогли.

Alex

0 голосов
/ 13 января 2011

Добавьте эту строку в вашу модель:

validates_presence_of :name

.errors свойственно ActiveRecord, поэтому да, если вы попытаетесь его использовать, вы получите ошибку.

User будет классом, а user будет экземпляром класса - без примера я не могу вам здесь помочь.

Чтобы избавиться от проблемы в консоли, вам понадобится require 'active_record' где-то в вашем приложении, потому что некоторая часть вашего кода все еще использует его, но не может найти его определение, потому что Gem не требуется.

Вы используете Bundler? Добавьте его в комплект. Используя Ruby Gems, просто укажите, что требуется в вашем приложении.

...