Вход в систему с помощью omniauth-facebook "неопределенный метод`slice'для nil:NilClass"ошибка

У меня проблема с использованием omniauth-facebook. я попытался войти в мое приложение rails, используя facebook, но оно выдает мне ошибку, и env['omniauth.auth'] выдает nil-значение, здесь ошибка..

 NoMethodError at /auth/facebook/callback
 undefined method `slice' for nil:NilClass

вот моя модель

#fields
  field :provider
  field :uid
  field :name
  field :oauth_token 
  field :oauth_expires_at , type: DateTime

  #functions
  def self.from_omniauth(auth)
    where(auth.slice(:provider, :uid)).find_or_initialize_by.tap do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.name = auth.info.name
      user.oauth_token = auth.credentials.token
      user.oauth_expires_at = Time.at(auth.credentials.expires_at)
      user.save!
    end
  end

а это мой контроллер

  def create
    user = Usersfb.from_omniauth(ENV["omniauth.auth"])
    session[:user_id] = user.id
    redirect_to root_url
  end
  def destroy
    session[:user_id] = nil
    redirect_to root_url
  end

мои маршруты

  root 'main#index'
  get 'session/destroy' , to: 'session#destroy'
  get 'auth/:provider/callback' => 'session#create'

2 ответа

Решение

Вы ошиблись в действии контроллера:

def create
  #user = Usersfb.from_omniauth(ENV["omniauth.auth"])
  user = Usersfb.from_omniauth(request.env["omniauth.auth"])
  session[:user_id] = user.id
  redirect_to root_url
end

ENV это переменные окружения не request.env, этот ENV["omniauth.auth"] вернуть nil и это where(auth.slice(:provider, :uid)) пробующий ломтик nil это повышение undefined method 'slice' for nil:NilClass,

request.env не работает для меня. Я добавил callback_path к инициализатору omniauth, и теперь он работает. Вот как это выглядит:

omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, APP_ID, APP_SECRET, callback_path: '/auth/facebook/callback'
end
Другие вопросы по тегам