1

Я выполнил все инструкции в прохождении Omniauth.. @user не сохраняется, перенаправляется на страницу регистрации

Обратите внимание, что моя модель пользователя не имеет имени или свойств изображения.

Я выполнил инструкции в учебнике Rails. Тем не менее, я должен изменить это:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :omniauth_providers => [:facebook] 

    def self.from_omniauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.email = auth.info.email 
     user.password = Devise.friendly_token[0,20] 
     user.name = auth.info.name # assuming the user model has a name 
     user.image = auth.info.image # assuming the user model has an image 
    end 
    end 

    def self.new_with_session(params, session) 
    super.tap do |user| 
     if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] 
     user.email = data["email"] if user.email.blank? 
     end 
    end 
    end 
end 

к этому:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :omniauth_providers => [:facebook] 

    def self.from_omniauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.email = auth.info.email 
     user.password = Devise.friendly_token[0,20] 
     # user.name = auth.info.name # assuming the user model has a name 
     # user.image = auth.info.image # assuming the user model has an image 
    end 
    end 

    def self.new_with_session(params, session) 
    super.tap do |user| 
     if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] 
     user.email = data["email"] if user.email.blank? 
     end 
    end 
    end 
end 
  • ошибка была быть брошенным, потому что пользователь не имеет name или image свойств. Это привело к новой ошибке: @user, созданный в Omniauth_callbacks_controller, не сохраняется, поэтому вместо входа в систему я просто перенаправляюсь обратно на страницу регистрации пользователя.

omniauth_callbacks_controller.rb:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def facebook 
    # You need to implement the method below in your model (e.g. app/models/user.rb) 
    @user = User.from_omniauth(request.env["omniauth.auth"]) 
    puts "BEFORE IF STATEMENT" 
    puts @user.inspect 
    if @user.persisted? 
     puts "INSIDE IF STATEMENT" 
     sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
     set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format? 
    else 
     puts "AFTER ELSE STATEMENT" 
     session["devise.facebook_data"] = request.env["omniauth.auth"] 
     redirect_to new_user_registration_url 
    end 
    end 
end 

сервера считана, который включает в себя puts заявление и объект @user. Вы увидите, что большинство ее полей равны нулю:

Started GET "https://stackoverflow.com/users/auth/facebook" for ::1 at 2015-09-01 20:41:01 +0100 
I, [2015-09-01T20:41:01.891561 #7662] INFO -- omniauth: (facebook) Request phase initiated. 


Started GET "https://stackoverflow.com/users/auth/facebook" for ::1 at 2015-09-01 20:41:01 +0100 
I, [2015-09-01T20:41:01.978637 #7662] INFO -- omniauth: (facebook) Request phase initiated. 


Started GET "https://stackoverflow.com/users/auth/facebook/callback?code=AQBcPU1SSS5908ZaCIgZjKnffSjG0PZTNcoyeSjiTbZDbVZvOKIz_YDoZzijNvfuc5QdIHczQPVAFqv3TMxDPZ_lGdUC3sg6d9iScaBgwVqU6uuoGppV7fAO-Q2ALN48is9-Exkr1o0JF2Yry9nebSxcSEDpBz39jDU0EMxOWCShGwG0CCaKLavOo0GzXzmZr1mpYaUZoBgxHSUdr3rRfhoqYMZOrYAYQeR8DMcAw7WR-C4PNKN9NyMwhzWDFv7mtoneP6dWAd22SNOLmQC64ahgJTFsN76brLl1Xl6HYR0wqjd4LBJeeV4uAumdVWkiIgo&state=0c40e8bcabffe59ec093223f78250db73c9a3d9b7717be97" for ::1 at 2015-09-01 20:41:02 +0100 
I, [2015-09-01T20:41:02.098574 #7662] INFO -- omniauth: (facebook) Callback phase initiated. 
Processing by Users::OmniauthCallbacksController#facebook as HTML 
    Parameters: {"code"=>"AQBcPU1SSS5908ZaCIgZjKnffSjG0PZTNcoyeSjiTbZDbVZvOKIz_YDoZzijNvfuc5QdIHczQPVAFqv3TMxDPZ_lGdUC3sg6d9iScaBgwVqU6uuoGppV7fAO-Q2ALN48is9-Exkr1o0JF2Yry9nebSxcSEDpBz39jDU0EMxOWCShGwG0CCaKLavOo0GzXzmZr1mpYaUZoBgxHSUdr3rRfhoqYMZOrYAYQeR8DMcAw7WR-C4PNKN9NyMwhzWDFv7mtoneP6dWAd22SNOLmQC64ahgJTFsN76brLl1Xl6HYR0wqjd4LBJeeV4uAumdVWkiIgo", "state"=>"0c40e8bcabffe59ec093223f78250db73c9a3d9b7717be97"} 
    User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."provider" = $1 AND "users"."uid" = $2 ORDER BY "users"."id" ASC LIMIT 1 [["provider", "facebook"], ["uid", "10153518057141280"]] 
    (0.2ms) BEGIN 
    (0.2ms) ROLLBACK 
BEFORE IF STATEMENT 
#<User id: nil, email: nil, encrypted_password: "$2a$10$6Ls8Eng6pNFz11sV/AmOuuUdq8JRas33H8UnWAX0YyA...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: nil, updated_at: nil, provider: "facebook", uid: "10153518057141280"> 
AFTER ELSE STATEMENT 
Redirected to http://localhost:3000/users/sign_up 
Completed 302 Found in 93ms (ActiveRecord: 1.1ms) 


Started GET "https://stackoverflow.com/users/sign_up" for ::1 at 2015-09-01 20:41:02 +0100 
Processing by Devise::RegistrationsController#new as HTML 
    Rendered /Users/makerslaptop91/.rvm/gems/ruby-2.2.0/gems/devise-3.5.1/app/views/devise/shared/_links.html.erb (1.0ms) 
    Rendered /Users/makerslaptop91/.rvm/gems/ruby-2.2.0/gems/devise-3.5.1/app/views/devise/registrations/new.html.erb within layouts/application (6.9ms) 
Completed 200 OK in 55ms (Views: 54.3ms | ActiveRecord: 0.0ms) 

Обратите внимание на puts внутри «если» заявление никогда не было напечатано.

routes.rb:

devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } 

    resources :restaurants do 
    resources :reviews 
    end 

    root to: "restaurants#index" 

Я в тупик.

+0

Вы разрешили это? – LpLrich

ответ

0

Если вы удалите опцию :validatable, тогда она будет работать.

+0

Я, к сожалению, не могу уточнить, поскольку я не знаю, в чем проблема. У меня была аналогичная проблема: запись действительно сохранялась в первый раз, но когда я удалил ее и попытался зарегистрироваться снова, она не спасла. – LpLrich

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

  • Нет связанных вопросов^_^