Rails — почему одно работает, а другое нет?

#ruby-on-rails #ruby-on-rails-3

#ruby-on-rails #ruby-on-rails-3

Вопрос:

У меня есть файл seeds.rb, и по какой-то причине это не работает:

 #doesn't work
u=User.new
u['email']=h['email']
u['password']=h['password']
puts u['email']
puts u['password']
if u.save
  puts "that saved"
else
  puts "that did not save"
end
  

но это делает:

 #does work
User.create({:email => h['email'], :password => h['password']})
  

Есть ли какая-то причина, по которой одно работает, а другое нет? Из консоли rails первый работает? Будут ли какие-либо различия в проверках? Я запускаю ‘rake db: seed’, поэтому думаю, что проверки будут действовать в обоих.

спасибо

редактировать # 1
извините за отсутствие информации. каждый выдает ошибку «пароль не может быть пустым», но затем он выдает пароль. Хм…

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

1. Что вы подразумеваете под «не работает»? Есть ли ошибка, или она просто не сохраняется? Если последнее, проверьте содержимое u.errors .

Ответ №1:

Узнайте, что происходит, просмотрев ошибки проверки:

 else
  puts "that did not save because "   u.errors.join(' ')
end
  

Редактировать: Теперь, когда вы добавили, что ошибки проверки содержат 'password cant be blank' и по-прежнему не сохраняются, становится ясно, что User.create() это делает ряд вещей, которые User.save() опускаются.

Чего не хватает, так это генерации хэша вашего пароля — отсюда blank password и ошибка.

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

1. каждый выдает ошибку «пароль не может быть пустым», но затем продолжает повторять пароль.

Ответ №2:

Попробуйте так:

 u = User.new
u.email = h['email']
u.password = h['password']
puts u.inspect
if u.save!
  puts "that saved"
else
  puts "that did not save"
end
  

Я считаю, что подход доступа к атрибуту u объекта as u['password'] ведет вас неправильно.

Кроме того, выполнение a u.inspect выводит все состояние модели, и это должно обеспечить более чистый способ увидеть, что происходит. Наконец, добавление bang ! в конце сохранения приведет к «быстрому сбою» и немедленно выдаст вам ошибку.