После чтения и испытания много реализаций, я заметил, что очень немного людей пытаются проверить на значения как JSON
, Math
, document
или объекты с опытными цепочками дольше, чем 1 шаг.
Вместо того, чтобы проверить typeof
из нашей переменной и затем взломать далеко пограничные случаи, я думал, что будет лучше, если проверка будет сохранена максимально простой избежать необходимости осуществлять рефакторинг, когда существуют новые примитивы, или собственные объекты добавили что регистр как typeof
из 'объекта'.
, В конце концов, typeof
оператор скажет Вам, если что-то будет объектом к JavaScript, но определение JavaScript объекта слишком широко для большинства реальных сценариев (например, typeof null === 'object'
). Ниже функция, которая определяет, является ли переменная v
объектом путем важного повторения двух проверок:
v
'[object Object]'
. v
заменен следующим прототипом в цепочке с [1 112], но также и непосредственно оценен после. Когда новое значение [1 113] null
, это означает, что каждый прототип включая корневой прототип (который, возможно, очень хорошо был только [1 127] прототип в цепочке) передали регистрацию цикла с условием продолжения, и мы можем возвратить true. Иначе новое повторение запускается.
function isObj (v) {
while ( Object.prototype.toString.call(v) === '[object Object]')
if ((v = Object.getPrototypeOf(v)) === null)
return true
return false
}
console.log('FALSE:')
console.log('[] -> ', isObj([]))
console.log('null -> ', isObj(null))
console.log('document -> ', isObj(document))
console.log('JSON -> ', isObj(JSON))
console.log('function -> ', isObj(function () {}))
console.log('new Date() -> ', isObj(new Date()))
console.log('RegExp -> ', isObj(/./))
console.log('TRUE:')
console.log('{} -> ', isObj({}))
console.log('new Object() -> ', isObj(new Object()))
console.log('new Object(null) -> ', isObj(new Object(null)))
console.log('new Object({}) -> ', isObj(new Object({foo: 'bar'})))
console.log('Object.prototype -> ', isObj(Object.prototype))
console.log('Object.create(null) -> ', isObj(Object.create(null)))
console.log('Object.create({}) -> ', isObj(Object.create({foo: 'bar'})))
console.log('deep inheritance -> ', isObj(Object.create(Object.create({foo: 'bar'}))))
У меня была та же проблема, что и у вас, я и мои друзья все сходили с ума из-за этого, пока мы не нашли эту ссылку http://weblog.rubyonrails.org/2009/8/30/ upgrade-to-snow-leopard
Я только что выполнил шаги установки mysql, и здесь он отлично сработал:]
База данных уже существует? MySQL установлен и запущен? Что изменилось? (Возможно, обновление ОС)? Работает ли свежее приложение rails? А как насчет других ваших сред (тестовая, производственная)?
Есть ли обратная трассировка? вы можете публиковать (используйте rake --trace db: create). Обычно MySQL возвращает очень явное сообщение об ошибке, rake просто съедает его.
Я только что столкнулся с этим при новой установке Snow Leopard.
У меня был другой проект, в котором базы данных создавались без проблем, но мой основной проект выдавал описанные вами ошибки. После осмотра, единственная разница заключалась в том, что в первом был указан сокет, а в неудачном проекте (и в вашем тоже) используется хост.
То есть, этот файл database.yml вызывает проблему:
development:
adapter: mysql
database: fanvsfan_development
username: root
password:
host: localhost
Но это работает:
development:
adapter: mysql
database: fanvsfan_development
username: root
password:
socket: /tmp/mysql.sock
Я не знаю, в чем разница, но это похоже на временное решение.
Это хорошая ссылка. И я получил, если это исправлено http://www.ultrasaurus.com/sarahblog/2008/12/getting-started-with-rails-2-day-1/
У меня возникла такая же проблема после установки нового сервера базы данных MySQL5.0–5.1. Если вы установили новый db-server, ваша библиотека mysql gem не подходит для вашего сервера базы данных. Вы можете решить эту проблему, переустановив mysql gem lib.
sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/your/mysql_config