Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Omniauth Facebook回调未在Rails可安装引擎中初始化_Ruby On Rails_Facebook_Omniauth_Rails Engines - Fatal编程技术网

Ruby on rails Omniauth Facebook回调未在Rails可安装引擎中初始化

Ruby on rails Omniauth Facebook回调未在Rails可安装引擎中初始化,ruby-on-rails,facebook,omniauth,rails-engines,Ruby On Rails,Facebook,Omniauth,Rails Engines,我正在开发一个可安装的引擎(称为SimpleUser),它使用Desive、OmniAuth和OmniAuth Facebook。首先,我做了一个测试应用程序的宝石和每一个工作良好。接下来,我以测试应用程序的代码为例,从头开始构建引擎 一切都差不多完成了,除了与Facebook的连接(它使用Javascript弹出窗口)。当我单击“登录”时,会显示FB弹出窗口,我授权应用程序,它会重定向到指定的路由(请参阅路由),但会抛出此错误: NoMethodError in SimpleUser::Aut

我正在开发一个可安装的引擎(称为SimpleUser),它使用Desive、OmniAuth和OmniAuth Facebook。首先,我做了一个测试应用程序的宝石和每一个工作良好。接下来,我以测试应用程序的代码为例,从头开始构建引擎

一切都差不多完成了,除了与Facebook的连接(它使用Javascript弹出窗口)。当我单击“登录”时,会显示FB弹出窗口,我授权应用程序,它会重定向到指定的路由(请参阅路由),但会抛出此错误:

NoMethodError in SimpleUser::AuthController#create
undefined method `[]' for nil:NilClass
错误发生在该操作的
authentication=authentication.find\u by_provider\u和_uid(auth['provider'],auth['uid'])
行中,其中auth为零(auth来自
auth=request.env[“omniauth.auth”]

我检查的一件事是回调阶段没有初始化。这是测试应用程序的日志:

从2013年3月14日开始获取127.0.0.1版本的“/auth/facebook/callback” 08:52:56-0600(facebook)回调阶段已启动。加工 AuthController#创建为HTML参数:{“提供者”=>“facebook”}

这是引擎应用程序的日志:

Started GET "/simple_user/auth/facebook/callback" for 127.0.0.1 at 2013-03-14 08:51:19 -0600
Processing by SimpleUser::AuthController#create as HTML
  Parameters: {"provider"=>"facebook"}
对于manageomniauth,我将gem添加到.gempec和gem文件中;此外,我需要引擎中的gems,在引擎的生成器中,我在安装期间将omniauth.rb模板移动到父应用程序的配置/初始值设定项。这就是我所拥有的:

AuthController(位于app/controllers/simple\u user/auth\u controller.rb中)

路线(在发动机上)

路由(在虚拟应用程序上)

.gemspec依赖项

  s.add_dependency "rails", "~> 3.2.12"
  s.add_dependency "devise"
  s.add_dependency "cancan"
  s.add_dependency "rolify"
  s.add_dependency "omniauth"
  s.add_dependency "omniauth-facebook", "1.4.1"
  s.add_dependency "simple_form"

  #s.add_development_dependency "mysql2"
  s.add_development_dependency "sqlite3"
  s.add_development_dependency "jquery-rails"
  s.add_development_dependency "debugger"
Gemfile

module SimpleUser

  require 'rubygems'
  require 'devise'
  require 'cancan'
  require 'rolify'
  require 'omniauth'
  require 'omniauth-facebook'
  require 'simple_form'

  class Engine < ::Rails::Engine
    isolate_namespace SimpleUser

    config.before_configuration do
      env_file = File.join(Rails.root, 'config', 'fb_config.yml')
      YAML.load(File.open(env_file)).each do |key, value|
        ENV[key.to_s] = value.to_s
      end if File.exists?(env_file)

      env_file = File.join(Rails.root, 'config', 'devise_config.yml')
      YAML.load(File.open(env_file)).each do |key, value|
        ENV[key.to_s] = value.to_s
      end if File.exists?(env_file)
    end
  end
end
match 'auth/:provider/callback', to: 'auth#create'
match 'auth/failure', to: redirect('/')
source "http://rubygems.org"

gemspec

gem 'devise'
gem 'cancan'
gem 'rolify'
gem 'omniauth'
gem 'omniauth-facebook', '1.4.1'
gem 'simple_form'

# Development
gem 'jquery-rails'
gem 'debugger'
我认为问题在于回调没有初始化,原因可能是OmniAuth没有被加载,但我不知道它是否被加载以及如何解决

你可以签入项目,如果你想克隆它并进行测试,你可以使用生成器
railsgsimple\u user:install
,你也可以看到test/dummy的代码来获得这个想法


非常感谢您。

解决方案是删除omniauth.rb并在引擎中包含omniauth的中间件,因此引擎如下所示:

module SimpleUser

  require 'rubygems'
  require 'devise'
  require 'cancan'
  require 'rolify'
  require 'omniauth'
  require 'omniauth-facebook'
  require 'simple_form'

  class Engine < ::Rails::Engine
    isolate_namespace SimpleUser

    middleware.use OmniAuth::Builder do
      provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'], :scope => ENV['FACEBOOK_SCOPE']
    end

    config.before_configuration do
      env_file = File.join(Rails.root, 'config', 'fb_config.yml')
      YAML.load(File.open(env_file)).each do |key, value|
        ENV[key.to_s] = value.to_s
      end if File.exists?(env_file)

      env_file = File.join(Rails.root, 'config', 'devise_config.yml')
      YAML.load(File.open(env_file)).each do |key, value|
        ENV[key.to_s] = value.to_s
      end if File.exists?(env_file)
    end

  end
end
模块简化程序
需要“rubygems”
需要“设计”
需要“cancan”
需要“角色化”
需要“omniauth”
需要“omniauth facebook”
需要“简单表格”
类引擎<::Rails::引擎
隔离名称空间SimpleUser
中间件。使用OmniAuth::Builder do
提供者:facebook,ENV['facebook\u KEY',ENV['facebook\u SECRET',:scope=>ENV['facebook\u scope']
结束
配置前请先配置
env_file=file.join(Rails.root,'config','fb_config.yml')
加载(File.open(env_File))。每个do |键,值|
ENV[key.to_s]=value.to_s
如果文件存在,则结束?(环境文件)
env_file=file.join(Rails.root,'config','designe_config.yml')
加载(File.open(env_File))。每个do |键,值|
ENV[key.to_s]=value.to_s
如果文件存在,则结束?(环境文件)
结束
结束
结束
感谢Dmitry Lihachev对类似问题的回答

mount SimpleUser::Engine => "/simple_user", :as => "simple_user"
  s.add_dependency "rails", "~> 3.2.12"
  s.add_dependency "devise"
  s.add_dependency "cancan"
  s.add_dependency "rolify"
  s.add_dependency "omniauth"
  s.add_dependency "omniauth-facebook", "1.4.1"
  s.add_dependency "simple_form"

  #s.add_development_dependency "mysql2"
  s.add_development_dependency "sqlite3"
  s.add_development_dependency "jquery-rails"
  s.add_development_dependency "debugger"
source "http://rubygems.org"

gemspec

gem 'devise'
gem 'cancan'
gem 'rolify'
gem 'omniauth'
gem 'omniauth-facebook', '1.4.1'
gem 'simple_form'

# Development
gem 'jquery-rails'
gem 'debugger'
module SimpleUser

  require 'rubygems'
  require 'devise'
  require 'cancan'
  require 'rolify'
  require 'omniauth'
  require 'omniauth-facebook'
  require 'simple_form'

  class Engine < ::Rails::Engine
    isolate_namespace SimpleUser

    middleware.use OmniAuth::Builder do
      provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'], :scope => ENV['FACEBOOK_SCOPE']
    end

    config.before_configuration do
      env_file = File.join(Rails.root, 'config', 'fb_config.yml')
      YAML.load(File.open(env_file)).each do |key, value|
        ENV[key.to_s] = value.to_s
      end if File.exists?(env_file)

      env_file = File.join(Rails.root, 'config', 'devise_config.yml')
      YAML.load(File.open(env_file)).each do |key, value|
        ENV[key.to_s] = value.to_s
      end if File.exists?(env_file)
    end

  end
end