2016-07-22 3 views
0

У меня возникают проблемы с дизайном и omniauth-facebook с рельсами. Я установил gem omniauth-facebook и gem devise.uninitialized constant Пользователи для omniauth_callbacks_controller с gem omniauth-facebook в ruby ​​on rails app

Я установил свой секрет fb и ключи в config/application.yml. Я настроил разработать в # конфиг/Инициализаторы/devise.rb:

Devise.setup do |config| 
    config.omniauth :facebook, ENV["FB_ID"], ENV["FB_SECRET"], scope: 'email', info_fields: 'email, first_name,last_name', image_size: 'large' 
end 

Я изменил свои маршруты следующим образом:

конфигурации/routes.rb

Rails.application.routes.draw do 
    devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' } 
end 

Я изменил свою пользовательскую модель:

# app/models/user.rb 

class User < ActiveRecord::Base 
    devise :omniauthable, omniauth_providers: [:facebook] 
end 

Я добавил следующие миграции рельсов:

$ rails g migration AddOmniauthToUsers \ 
    provider uid picture first_name last_name token token_expiry:datetime 
$ rake db:migrate 

В моей модели пользователя:

# app/models/user.rb 
class User < ActiveRecord::Base 
    def self.find_for_facebook_oauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.email = auth.info.email 
     user.password = Devise.friendly_token[0,20] # Fake password for validation 
     user.first_name = auth.info.first_name 
     user.last_name = auth.info.last_name 
     user.picture = auth.info.image 
     user.token = auth.credentials.token 
     user.token_expiry = Time.at(auth.credentials.expires_at) 
    end 
    end 
end 

Я создал новый контроллер для обработки запросов OmniAuth CallBack

# app/controllers/users/omniauth_callbacks_controller.rb 

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def facebook 
    user = User.find_for_facebook_oauth(request.env['omniauth.auth']) 

    if user.persisted? 
     sign_in_and_redirect user, event: :authentication 
     set_flash_message(:notice, :success, kind: 'Facebook') if is_navigational_format? 
    else 
     session['devise.facebook_data'] = request.env['omniauth.auth'] 
     redirect_to new_user_registration_url 
    end 
    end 
end 

Моего facebook подключение работает на моем локальном приложении, но это делает сбой приложения на heroku с самого начала с этим сообщением об ошибке:

Я правильно установил переменные окружения на heroku и heroku run rake db: mig ставка.

Откуда возникает эта ошибка и как ее исправить?

/app/app/controllers/Users/omniauth_callbacks_controller.rb:1:in `<top (required)>': uninitialized constant Users (NameError) 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:472:in `block (2 levels) in eager_load!' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:471:in `each' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:471:in `block in eager_load!' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:469:in `each' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:469:in `eager_load!' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:346:in `eager_load!' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/application/finisher.rb:56:in `each' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/application/finisher.rb:56:in `block in <module:Finisher>' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `instance_exec' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `run' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:55:in `block in run_initializers' 
    from /app/vendor/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:228:in `block in tsort_each' 
    from /app/vendor/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component' 
    from /app/vendor/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:431:in `each_strongly_connected_component_from' 
    from /app/vendor/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:349:in `block in each_strongly_connected_component' 
    from /app/vendor/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:347:in `each' 
    from /app/vendor/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:347:in `call' 
    from /app/vendor/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:347:in `each_strongly_connected_component' 
    from /app/vendor/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:226:in `tsort_each' 
    from /app/vendor/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:205:in `tsort_each' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:54:in `run_initializers' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/application.rb:352:in `initialize!' 
    from /app/config/environment.rb:5:in `<top (required)>' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/application.rb:328:in `require_environment!' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:142:in `require_application_and_environment!' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:67:in `console' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:39:in `run_command!' 
    from /app/vendor/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/commands.rb:17:in `<top (required)>' 
    from /app/bin/rails:9:in `require' 
    from /app/bin/rails:9:in `<main>' 

ответ

1

первое возможное решение: ошибка

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

вы видите этот config.autoload_paths + =% W (# {config.root}/Lib) в файле application.rb ли? если нет, вы можете положить его туда и повторить попытку? дайте мне знать, как это происходит.

второе возможное решение:

попытка переключиться обратно:

devise_for :users, controllers: { omniauth_callbacks: 'omniauth_callbacks' 

и, конечно, переместить chnaged

class OmniauthCallbacksController < Devise::OmniauthCallbacksController 

для приложений/контроллеров/omniauth_callbacks_controller.rb

надеюсь, что это поможет! дайте мне знать

+0

спасибо! второе решение работает –

+0

Отлично! Рад, что это сработало. – loloso

+0

У вас есть объяснение, почему он не работал? –

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

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