Omniauth-facebook с Devise:" отсутствует passthru " ошибки



Я установил аутентификацию Devise без проблем. Теперь Facebook пытается добавить опцию для входа в систему с помощью Facebook Omniauth.



Я следовал инструкциям в этом руководстве , но я получаю ошибки о пропущенной документации "Passthru", когда посещаю url localhost:3000/auth/facebook.



Вот первая ошибка, которую я получил:



Unknown action
The action 'passthru' could not be found for RegistrationsController


Я попытался исправить bandaid, просто добавив пустое действие "passthru"к моему контроллеру:



def passthru
end


И это решило, что ошибка, но взамен я получил другую:



Template is missing
Missing template registrations/passthru, devise/registrations/passthru, devise/passthru, application/passthru with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in: * "/home/user/project/app/views" * "/home/user/.rvm/gems/ruby-2.0.0-p648@railstutorial_rails_4_0/gems/devise-3.5.2/app/views"


Я попытался создать " passthru.формат html.erb " в указанных папках, но эта ошибка осталась. В любом случае, я думаю, что эти ошибки символизируют более глубокую проблему.



Кто-нибудь еще столкнуться с этой проблемой? Все, что я смог найти на нем, было этот вопрос SO, но ни один из ответов не помог.





Мой код таков далеко:



Gemfile



gem 'devise'
gem 'omniauth-facebook'
gem 'omniauth'


Маршруты.rb



Devise_for: участники, контроллеры: { registrations: 'регистрации', omniauth_callbacks: 'registrations' }



Член.rb



  devise :database_authenticatable, :registerable,
:omniauthable, :omniauth_providers => [:facebook]


def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |member|
member.email = auth.info.email
member.password = Devise.friendly_token[0,20]
member.title = auth.info.name
end
end


Registrations_controller.rb



  def facebook
@member = Member.from_omniauth(request.env["omniauth.auth"])
if @member.persisted?
sign_in_and_redirect @member, :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_member_registration_url
end
end

def failure
redirect_to root_path
end

def passthru
end


Инициализаторы / изобретатели.rb



config.omniauth :facebook, "<app_id>", "<app_secret>"
770   4  

4 ответов:

Попробуйте это :

Обновить GemFile:

gem 'omniauth-facebook'
gem 'omniauth'

Goto rails_apps/yourapp/config / initializers / devise.rb

Devise.setup do |config|
   config.omniauth :facebook, "KEY", "SECRET"
 end

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

class User < ActiveRecord::Base

         devise :database_authenticatable, :registerable,
        :recoverable, :rememberable, :trackable, :validatable,
    :omniauthable, :omniauth_providers => [:facebook]

     def self.from_omniauth(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]
         end
     end
    end

Goto: rails_apps/yourapp/config / routes.rb

Rails.application.routes.draw do
  devise_for :users
  resources :users
end

Редактировать в представлении

 <%= link_to "Sign in with Facebook", "/auth/facebook", id: "sign_in" %>

Passthru-это реликвия от omniauth обновите свои драгоценные камни изобретения omniauth и так далее . существует контроллер под названием omiauth_callback это тот, который делает noizes; P. (может помочь вам отследить источник проблемы)

Если вы создадите метод в контроллере, как это : def passthru end Вы должны создать представление с (даже пустым), или перенаправление: получить вдохновение от методов ajax, чтобы обойти HTML рендеринга . Надеюсь, что это пошлет вас на путь решения проблем .

Попробуйте также тезисы маршрутов : `` user_omniauth_authorize /пользователи/авт/:поставщик(.: формат) сессии#passthru {: provider=> / facebook / twitter / google/}

User_omniauth_callback / users / auth/: action/callback(.: формат) сессии#(?- микс: facebook / twitter / google) `

Вы можете создать другой контроллер для Omniauth callback

class OmniauthCallbacksController < Devise::OmniauthCallbacksController

  def facebook
    @user =  User.from_omniauth(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


  def after_sign_in_path_for(resource)
    super resource
  end

end

Вам нужно сбросить маршруты как

devise_for :members, :controllers => {:registrations => "members/registrations", :omniauth_callbacks => 'omniauth_callbacks'}

Насколько я помню, вам не нужно использовать :omniauth_providers => [:facebook] в вашем member.rb

Теперь вы можете добавить кнопку в свой sign_up page или вместо этого включить приведенный ниже код в свой devise/shared/_links.html.erb, потому что он также будет доступен в вашей форме sign_in.

<%- if devise_mapping.omniauthable? %>
  <%- resource_class.omniauth_providers.each do |provider| %>
    <%= link_to "Sign up with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider), class: "btn btn-default navbar-btn" %><br />
  <% end -%>
<% end -%>

Вам также нужно настроить devise в инициализаторах

В вашем /config/initializers/devise.rb

config.omniauth :facebook, "App ID", "App Secret", scope: 'email', info_fields: 'email,name'

Пожалуйста, пройдите через это самое простое учебник для Sing_up с facebook ссылка

Попробуйте это .........

Config / инициализаторы / devise.rb

config.omniauth :facebook, ENV["FACEBOOK_KEY"], ENV["FACEBOOK_SECRET"], { :scope => 'email, offline_access'}

Конфигурация / маршруты.rb

devise_for :members, controllers: { registrations: 'registrations', omniauth_callbacks: "omniauth_callbacks" }

Приложение / модели / участник.rb

devise :database_authenticatable, :registerable,
      :recoverable, :rememberable, :trackable, :validatable, :omniauthable


def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |member|
    member.email = auth.info.email
    member.password = Devise.friendly_token[0,20]
    member.title = auth.info.name
  end
end 

App / controllers / omniauth_callbacks_controller.rb

  skip_before_filter :authenticate_user!

  def facebook
    p env["omniauth.auth"]
    user = User.from_omniauth(env["omniauth.auth"])
    if user.persisted?
      flash[:notice] = "You are in..!!!"
      sign_in_and_redirect(user)
    else
      session["devise.user_attributes"] = user.attributes
      redirect_to new_user_registration_url
    end
  end

  def failure
    #handle you logic here..
    #and delegate to super.
    super
  end

Надеюсь, что это сработает для вас.

Comments

    Ничего не найдено.