2013-07-13 3 views
1

Я использую код Railcast episode, код находится в Github here.Ошибка при проверке подлинности при использовании omniauth + twitter + devise

К сожалению, я получаю ошибку: The change you wanted was rejected. (Как ни странно, я несколько раз реализованы и никогда не случалось со мной раньше)

В журнале Heroku, я получаю:

2013-07-13T09:06:49.096663+00:00 app[web.1]: Completed 422 Unprocessable Entityin 83ms 
    2013-07-13T09:06:49.099178+00:00 app[web.1]: 
    2013-07-13T09:06:49.099178+00:00 app[web.1]: ActiveRecord::RecordInvalid (Validation failed: Email can't be blank): 
    2013-07-13T09:06:49.099178+00:00 app[web.1]: app/models/user.rb:14:in `from_omniauth' 
    2013-07-13T09:06:49.099178+00:00 app[web.1]: 
    2013-07-13T09:06:49.099178+00:00 app[web.1]: 
    2013-07-13T09:06:49.099178+00:00 app[web.1]: app/models/user.rb:20:in `block in from_omniauth' 
    2013-07-13T09:06:49.099178+00:00 app[web.1]: app/controllers/omniauth_callbacks_controller.rb:3:in `all' 

Я считаю, что это ошибка проверки подлинности электронной почты, сделанная erro. Поскольку в моем методе from_omniauth я не получаю электронное письмо.

def self.from_omniauth(auth) 
    where(auth.slice(:provider, :uid)).first_or_create do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.name = auth.info.nickname 
     user.image = auth.info.image 
     user.save! 
    end 
    end 

Предотвращает ли отказ валидации user.save!? Могу ли я использовать его позже в omniauth_callbacks?

+0

сгенерированного Придумайте миграции добавляет не пустой и уникальный на колонке электронной почты, может быть, это так? –

+0

Да, у меня это. Таким образом, это предотвратит «.save?» – cqcn1991

+0

Но в одном из моих репозиториев olrder. Я также получил это 't.string: email,: null => false,: default =>" "' Он работал в то время. – cqcn1991

ответ

0

Наконец я понять это использование where(auth.slice(:provider, :uid)).first_or_initialize do |user| заменить where(auth.slice(:provider, :uid)).first_or_create do |user| и удалить save! в блоке

1

Я предлагаю добавить миграцию как этот

remove_index :users, :email 
change_column :users, :email, default: nil, allow_null: true 

Если вы хотите сохранить индекс по электронной почте для быстрого поиска также добавить

add_index :users, :email # this index will be simple btree in postgres, not uniq 

добавить этот метод на модели пользователя

def email_required? 
    provider.blank? 
end 

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

+0

но зачем удалять индекс? – cqcn1991

+0

Есть уникальный индекс только по электронной почте. Вы можете добавить обычный индекс, если хотите, обновив ответ –

+0

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

Смежные вопросы