devise + omniauth излизане

Най-накрая получих „влезте с Facebook“, за да работя с devise/omniauth, но когато потребител е влязъл, връзката „влезте с facebook“ не се променя на „излезте“ и/или няма видимо излизане опция.

ето моя файл route.rb

devise_for :users, :controllers => {:omniauth_callbacks => "users/omniauth_callbacks", :registrations => 'registrations'}, :path_names => { :sign_in => 'login', :sign_out => 'logout' } do
  get 'login' =>'devise/sessions#new', :as => :new_user_session
  post 'login' => 'devise/sessions#create', :as => :user_session
  get 'signup'  => 'registrations#new', :as => :new_user_registration
  get 'signout' => 'devise/sessions#destroy', :as => :destroy_user_session

край

и тук е потребителският файл

class User < ActiveRecord::Base
devise :omniauthable, :omniauth_providers => [:facebook]
def self.find_for_facebook_oauth(auth, signed_in_resource=ni)
user = User.where (:provider => auth.provider, :uid => auth.uid).first
unless user

def self.find_for_facebook_oauth(auth, signed_in_resource=nil)
user = User.where
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

end

сесиен контролер:

class SessionsController < ApplicationController
def create
 user = User.from_omniauth(env["omniauth.auth"])
 session[:user_id] = user.id
 redirect_to root_path
 end

def destroy
 session.delete[:user_id] = nil
 redirect_to root_path
end
end

Omniauth_callbacks_controller:

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.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)

if @user.persisted?
  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
  session["devise.facebook_data"] = request.env["omniauth.auth"]
  redirect_to new_user_registration_url
end
end
end

и накрая, оформлението на приложението

<% if current_user %>
      Signed in as <strong><%= current_user.name %></strong>!
      <%= link_to "Sign out", destroy_user_session, id: "sign_out" %>
    <% else %>
  <li><%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %></li>
  <% end %>

Не съм съвсем сигурен какво продължавам да правя грешно или защо ми е трудно да търся отговора, така че реших, че може да е по-лесно просто да поставя кода. Нов съм в това, така че всяка помощ е благодарна. Благодаря!


person user3130910    schedule 04.01.2014    source източник
comment
Ще публикувате ли вашия контролер за потребители/omniauth_callbacks?   -  person ruevaughn    schedule 05.01.2014
comment
Ако можете, моля, редактирайте оригиналния си отговор и добавете този код най-отдолу, това би било много по-добре. Също така, моля, включете вашия потребителски модел, тъй като той се извиква от User::OmniauthCallbackController   -  person ruevaughn    schedule 06.01.2014
comment
разбрах, актуализирано! това е наистина основен въпрос, но къде мога да намеря потребителския модел?   -  person user3130910    schedule 06.01.2014
comment
Ще намерите модели, разположени в app/models, така че потребителският модел ще бъде в app/models/user.rb   -  person ruevaughn    schedule 10.01.2014
comment
добре, потребителският модел е вторият набор от код по-горе - мисля, че частта от ominiauth работи, тъй като се свързва с facebook - може би проблемът е нещо в това как omniauth работи с devise? трябва ли да настроя devise отделно, когато изпълнявам omniauth + devise? не го направих, преди omniauth git wiki не спомена, че трябва да направя това...   -  person user3130910    schedule 11.01.2014


Отговори (1)


Кратък отговор - current_user е нула, така че всъщност не сте влезли.

Ако „Влезте с Facebook“ все още се показва, а Изход не се показва, предполагам, че „Влезли сте като“ също не се показва.

Това най-вероятно се дължи на това, че този current_user не е зададен, така че този ред е неуспешен

<% if current_user %>

и така този код се задейства

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

Така че предполагам, че current_user всъщност не се настройва, следователно не сте влезли в системата. Можете да добавите филтъра на контролера за устройство authenticate_user!, за да видите дали сте влезли или не. Нещо като

class ApplicationController
  before_filter :authenticate_user!
end

Което ще ви пренасочи, ако не сте влезли.

Използвайте Pry, за да разберете

Pry е страхотен инструмент за отстраняване на грешки от този вид неща

За да отстраните грешки с pry, трябва да добавите към вашия Gemfile

group :development do
  gem "pry", "~> 0.9.12.4"
end

и стартирайте bundle install

след това можете да добавите това към вашия код

<%= binding.pry %>
<% if current_user %>
  Signed in as <strong><%= current_user.name %></strong>!
  <%= link_to "Sign out", destroy_user_session, id: "sign_out" %>
<% else %>
  <li><%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %></li>
<% end %>

Преминете през нормалния си работен процес за влизане с Facebook и Rails сървърът във вашия терминал ще „спре“ на `‹% binding.pry %> и ще ви позволи да изпълнявате команди, включително проверка на променливи.

В терминала, в който работи вашата rails конзола, трябва да видите нещо подобно

current_user ? "There is a current user set" : "No current user is set"

Можете също така просто да бягате

current_user

но първият има по-подробен изход. Някои други полезни команди за отстраняване на грешки включват

help whereami exit !!!

person ruevaughn    schedule 04.01.2014
comment
благодаря за отговора ти, @ruevaughn! добре, така че когато за първи път влязох, ме отведе във facebook, за да потвърдя и удостоверя, че искам да вляза с facebook... значи това означава ли, че работи или не? как да настроя потребителя, ако не е зададен? - person user3130910; 06.01.2014
comment
Този екран означава, че сте конфигурирали всичко правилно, за да общувате с facebook, но не означава, че след това всичко е променено. Мисля, че имате синтактична грешка във вашия User::OmniauthCallbacksController, вероятно тук: User.find_for_facebook_oauth(request.env[omniauth.auth], current_user)** - person ruevaughn; 06.01.2014
comment
sign_in_and_redirect @user е това, което трябва да влезе в профила ви и да зададе current_user - person ruevaughn; 06.01.2014