2

У меня есть приложение, построенное на Rails 4.2 и пытающееся выполнить проверку подлинности twitter, используя RailsCasts #241 Simple OmniAuth.
Но есть ли эта проблема: Validation failed: Password can't be blank!
Я искал ответ везде, но не нашел решения!Не удалось выполнить проверку: Пароль не может быть пустым

user.rb

class User < ActiveRecord::Base 

    has_secure_password 
    validates :password, length: { minimum: 6 }, allow_blank: true 
    def self.create_with_omniauth(auth) 
     create! do |user| 
      user.provider = auth.provider 
      user.uid = auth.uid 
      user.name = auth.info.name 
     end 
    end 
end 

sessions_controller.rb

class SessionsController < ApplicationController 
    def login 
    end 

    def create 
     @user = User.find_by_email(params[:email]) 
     if @user && @user.authenticate(params[:password]) 
      session[:user_id] = @user.id 
      redirect_to root_path 
     else 
      redirect_to :back 
     end 
    end 

    def create_session 
     auth = request.env['omniauth.auth'] 
     user = User.find_by_provider_and_uid(auth['provider'], auth['uid']) || User.create_with_omniauth(auth) 
     session[:user_id] = user.id 
     redirect_to root_url, notice: 'Signed in!' 
    end 

    def logout 
     reset_session 
     redirect_to root_path 
    end 
end 

routes.rb

get 'sessions/login' 
    get 'sessions/logout' 
    post 'sessions' => 'sessions#create' 

    get '/auth/:provider/callback' => 'sessions#create_session' 
    post '/auth/:provider/callback' => 'sessions#create_session' 

    get 'registration' => 'users#new', as: 'registration' 

Решение
После редактирования user.rb модель выглядит следующим образом:

class User < ActiveRecord::Base 

    has_secure_password 
    validates :password, length: { minimum: 6 } 
    require 'securerandom' 
    def self.create_with_omniauth(auth) 
     create! do |user| 
      user.provider = auth.provider 
      user.uid = auth.uid 
      user.name = auth.info.name 
      user.password = SecureRandom.urlsafe_base64 
     end 
    end 
end 
+0

попробовать 'allow_blank' вместо' allow_nil' – Sontya

+0

это ничего не изменилось! –

+0

Отметьте «минимальную» проверку на данный момент, просто попробуйте 'allow_blank' – Sontya

ответ

3

Альтернативный подход, чтобы ввести случайный пароль на создание пользователей. Например, как показано в файле omniauth-google-oauth2. Таким образом, вы можете изменить свой код на этот:

require 'securerandom' 
def self.create_with_omniauth(auth) 
    create! do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.name = auth.info.name 
     user.password = SecureRandom.urlsafe_base64 
    end 
end 
+0

Не похоже, что он решает основную проблему, хотя решение ниже не похоже на меня, но оно работает сейчас! –

5

Я думаю, что проблема с

has_secure_password 

попробовать комментируя его, и вы можете переопределить has_secure_password Или

has_secure_password(validations: false) 

Это происходит как автоматическое LLY добавляет

validates_presence_of :password_digest 

Поэтому, когда указать allow_blank или allow_null он не будет работать