2015-02-19 5 views
0

Я пытаюсь использовать OmniAuth для интеграции Facebook с моим сайтом, и я думаю, что у меня здесь несколько ошибок. Прямо сейчас, когда я нажимаю «Войти в Facebook», он приводит меня в Facebook, но вскоре, когда я вхожу в систему, я получаю сообщение об ошибке ActiveModel::ForbiddenAttributesError. Кроме того, я думаю, что может быть проблема и с моими маршрутами, но я не уверен.Rails: ActiveModel :: ForbiddenAttributesError

Кроме того, я следовал за этим Railscasts учебник: http://railscasts.com/episodes/360-facebook-authentication?autoplay=true

Edit: Ошибка на этой линии здесь, where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|

omniauth.rb

OmniAuth.config.logger = Rails.logger 

Rails.application.config.middleware.use OmniAuth::Builder do 
    provider :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_SECRET'] 
end 

user.rb

class User < ActiveRecord::Base 
    def self.from_omniauth(auth) 
    where(auth.slice(:provider, :uid)).first_or_initialize.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 
end 

routes.rb

Rails.application.routes.draw do 

    get 'auth/:provider/callback', to: 'sessions#create' 
    get 'auth/failure', ('/posts/index') 
    get 'signout', to: 'sessions#destroy', as: 'signout' 

    resources :welcome 
    resources :posts 

    root "welcome#index" 

sessions_controller.rb

class SessionsController < ApplicationController 
    def create 
    user = User.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 
end 

application_controller.rb

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 

    private 

    def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    end 
    helper_method :current_user 
end 
+0

возможно дубликат [Rails 4.1.5 OmniAuth сильные параметры ] (http://stackoverflow.com/questions/25399414/rails-4-1-5-omniauth-st rong-parameters) – zhurora

ответ

4

Измените искатель так:

class User < ActiveRecord::Base 
    def self.from_omniauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_initialize 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 
end 
+0

Удивительный, это, казалось, решило эту проблему. За исключением случаев, когда я сейчас нажимаю ссылку для входа в Facebook, я получаю пустую страницу с небольшой ошибкой, написанной красным цветом, в которой говорится: «Требуется параметр app_id». Вы хоть понимаете, что это значит? – roguerat

+0

hm nevermind Я исправил его, но я не уверен, почему это исправлено ... в моем 'omniauth.rb' я удалил оба из' ENV ', которые находятся в стороне от id приложения и fb, и теперь он работает. Это потрясающе, но я не уверен, что это вызовет проблемы в будущем? – roguerat

+0

Итак, вместо ENV вы написали app_id и секрет непосредственно в файл? – coderhs

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