Devise、OmniAuth、OmniAuth-Facebook を使用するマウント可能なエンジン (SimpleUser と呼ばれる) を開発しています。最初に、宝石についてのテストアプリを作成しましたが、すべて正常に機能しました。次に、例としてテスト アプリのコードを使用して、エンジンをゼロから構築し始めました。
Facebook との接続 (Javascript ポップアップを使用) を除いて、すべてがほぼ完了しています。「ログイン」をクリックすると、FB ポップアップが表示されます。アプリを許可すると、指定されたルートにリダイレクトされますが (ルートを参照)、次のエラーがスローされます。
NoMethodError in SimpleUser::AuthController#create
undefined method `[]' for nil:NilClass
エラーは、そのアクションのauthが nil である行 ( authentication = Authentication.find_by_provider_and_uid(auth['provider'], auth['uid'])auth comes from ) で発生します。auth = request.env["omniauth.auth"]
私が確認することの 1 つは、Callback フェーズが初期化されていないことです。これは、テスト アプリのログです。
2013-03-14 08:52:56 -0600 (facebook) で 127.0.0.1 の GET "/auth/facebook/callback" を開始しました。コールバック フェーズが開始されました。HTMLパラメータとしてAuthController#createで処理: {"provider"=>"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"}
OmniAuth を管理するために、gemspec と Gemfile に gem を追加しました。また、エンジンに gem が必要であり、エンジンのジェネレーター内で、インストール中に omniauth.rb のテンプレートを親アプリの config/initializers に移動します。これは私が持っているものです:
AuthController (app/controllers/simple_user/auth_controller.rb にあります)
module SimpleUser
  class AuthController < ApplicationController
    def create
      auth = request.env["omniauth.auth"]   
      authentication = Authentication.find_by_provider_and_uid(auth['provider'], auth['uid'])
      if authentication
        flash[:notice] = "Signed in successfully."
        sign_in(:user, authentication.user)
        redirect_to root_url
      else
        user = User.build_new_auth(auth)
        #user.apply_omniauth(auth)
        if user.save(:validate => false)
          flash[:notice] = "Account created and signed in successfully."
          sign_in(:user, user)
          redirect_to root_url
        else
          flash[:error] = "Error while creating the user account. Please try again."
          redirect_to root_url
        end
      end
    end
  end
end
エンジン
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
発生器
module SimpleUser
  module Generators
    class InstallGenerator < ::Rails::Generators::Base
      source_root File.expand_path("../templates", __FILE__)
      desc "Install SimpleUser"
      def copy_config_file
        copy_file "fb_config.yml", "config/fb_config.yml"
        copy_file "devise_config.yml", "config/devise_config.yml"
        copy_file "omniauth.rb", "config/initializers/omniauth.rb"
      end
      def copy_migrations
        rake "simple_user:install:migrations"
        SimpleUser::Engine.load_seed
      end
    end
  end
end
omniauth.rb のテンプレート
require 'omniauth'
require 'omniauth-facebook'
OmniAuth.config.logger = Rails.logger
Rails.application.config.middleware.use OmniAuth::Builder do
    provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'], :scope => ENV['FACEBOOK_SCOPE']
end
ルート (エンジン上)
match 'auth/:provider/callback', to: 'auth#create'
match 'auth/failure', to: redirect('/')
ルート(ダミーアプリ上)
mount SimpleUser::Engine => "/simple_user", :as => "simple_user"
.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
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がロードされていないことが原因かもしれませんが、そうであるかどうか、またどのように解決するかはわかりません.
https://github.com/pablomarti/simple_userでプロジェクトを確認できます。クローンを作成してテストする場合は、ジェネレーターを使用できますrails g simple_user:install。また、test/dummy のコードを参照してアイデアを得ることができます。
事前にどうもありがとうございました。