1

Я новичок, пытающийся добавить facebook login в мое приложение rails, используя omniauth & 2 и omniauth-facebook. Я следовал инструкциям на https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview.Facebook логин с omniauth не работает

Но теперь он показывает мне ошибку ниже, я обыскал сеть и пробовал много разных способов без особого успеха, я понятия не имею, что я делаю неправильно, поэтому могу ли я помочь кому-то с этим? очень признателен.

Бег на

рельсов (3.2.12) Используя oauth2 (0.8.1) Используя OmniAuth (1.1.4) Используя OmniAuth-oauth2 (1.1.1) Использование OmniAuth-Facebook (1.4. 1)

Ошибка: ActiveRecord :: RecordNotFound в UsersController # показать не удалось найти пользователя с идентификатором = sign_up

Мой код

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

# Setup accessible (or protected) attributes for your model 
attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :provider, :uid, :name 
attr_accessible :title, :date_of_birth, :firstName, :lastName, :mailId, :phone, :provider, :uid 

protected 

def self.find_for_facebook_oauth(auth, signed_in_resource=nil) 
user = User.find(:provider => auth.provider, :uid => auth.uid).first 
unless user 
    user = User.create(name:auth.extra.raw_info.name, 
         provider:auth.provider, 
         uid:auth.uid, 
         email:auth.info.email, 
         password:Devise.friendly_token[0,20] 
         ) 
end 
user 
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 

has_many :pins, :dependent => :destroy 

конец

devise.rb

require 'devise/orm/active_record' 
require 'omniauth-facebook' 

config.omniauth_path_prefix = "https://stackoverflow.com/users/auth" 
config.omniauth :facebook, "XXXX", "XXXX", {:client_options => { :ssl => { :verify => false } }} 
end 

routes.rb

Dine::Application.routes.draw do 
get "home/index" 


resources :pins 
resources :pin 
resources :users 

match '/auth/facebook' => 'omniauth#passthru' 

devise_scope :user do 
get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru' 

devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } , :strategy_class => OmniAuth::Strategies::Facebook 
match 'users/:id' => 'users#show', as: :user 

root :to => 'pins#index' 
get 'about' => 'pages#about' 
get 'weekly' => 'pages#weekly' 
get 'shop' => 'pages#shop' 
get 'service' => 'pages#service' 
get 'privacy' => 'pages#privacy' 
get 'test' => 'pages#test' 
get 'recipies' => '[email protected]' 

match 'contact' => 'contact#new', :as => 'contact', :via => :get 
match 'contact' => 'contact#create', :as => 'contact', :via => :post 
end 
end 

OmniauthCallbacksController

class OmniauthCallbacksController < Devise::OmniauthCallbacksController 

def passthru 
send(params[:provider]) if providers.include?(params[:provider]) 
end 

protected 

def facebook 
raise "Implement me for facebook" 
end 

def twitter 
raise "Implement me for twitter" 
end 

private 

def providers 
["facebook", "twitter"] 
end 
end 

UsersController

class UsersController < ApplicationController 
def show 
@user = User.find(params[:id]) 
@pins = @user.pins.page(params[:page]).per_page(20) 
end 
end 

new.html.erb

<h2>登入</h2> 

<%= simple_form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %> 
<div class="form-inputs"> 
<%= f.input :email, :required => false, :autofocus => true %> 
<%= f.input :password, :required => false %> 
<%= f.input :remember_me, :as => :boolean if devise_mapping.rememberable? %> 
</div> 

<%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %> 

<div class="form-actions"> 
<%= f.button :submit, "Sign in" %> 
</div> 
<% end %> 

<%= render "devise/shared/links" %> 
+0

Ваша ошибка в методе showController. возможно, вы должны опубликовать этот ... – Miotsu

+0

@Miotsu, я только что обновил UserController. Однако в учебнике никогда не упоминалось об изменении чего-либо в UserController. –

+0

Итак, сообщение об ошибке, которое вы получаете, сообщает вам, что вы передаете знак «sign_up» в своих параметрах [: id]. Посмотрите на ссылку/представление/все, что вызывает этот метод, и дважды проверьте параметры, которые вы передаете. – Miotsu

ответ

0
  1. из терминала:

    расслоение Exec рейк маршруты >> r.txt

  2. открытой r.txt и смотрите для строки, содержащей users#show, запишите первый член этой строки, который должен быть чем-то вроде user_show (назовем его the_route).

  3. добавить _path на свой маршрут (например, the_route_path) и выполнить поиск по всему проекту для этой строки.

  4. где-то в вашем проекте (скорее всего, в представлении) будет link_to или redirect_tothe_route_path, и я предполагаю, что где-то будет проходить 'sign_up' как :id паров.

  5. вот где ошибка.

+0

Привет Miotsu, большое вам спасибо за помощь. Я только что обновил представление new.html.erb выше. Я предполагаю, что проблема исходила из этой строки кода, но как мне ее исправить? <% = link_to "Войти через Facebook", user_omniauth_authorize_path (: facebook)%> –

+0

<% = simple_form_for (resource,: as => resource_name,: url => session_path (resource_id)) do | f | %> – Miotsu

+0

Извините, вы хотите, чтобы я заменил приведенный выше код на new.html.erb? Я пробовал, но он не работает. –