omniauth gem を使用して、ユーザーが Rails アプリにサインアップ/ログインできるようにしています
これが私のgemfileの一部です
gem 'omniauth'
gem 'omniauth-twitter'
gem 'twitter'
Omniauth = v1.1.4、Omniauth-twtter は v0.0.16、Omniauth-oauth は v1.0.1、Twitter は 4.6.2
Rails を 3.1.1 から 3.1.3 にアップグレードした後、同様のエラーの間違った引数の数 (1 に対して 3) でこのスレッドに出くわしたので、Omniauth をアンインストールしてバージョン "~> 0.2.6" にダウングレードしようとしましたが、これを取得しましたメッセージ:
バンドルは現在 omniauth を 1.1.4 でロックしています。omniauth のバージョンが問題の原因ですか、それとも別の原因ですか?
修正しようとしているエラー メッセージは、Twitter サインインを使用しようとしたときに表示されるものです。
ArgumentError in AuthenticationsController#create
wrong number of arguments (3 for 1)
app/helpers/sessions_helper.rb:4:in `sign_in'
app/controllers/authentications_controller.rb:12:in `create'
これが私のauthentications_controller.rbです
class AuthenticationsController < InheritedResources::Base
def index
@authentications = current_user.authentications if current_user
end
def create
omniauth = request.env['omniauth.auth']
authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
if authentication
flash[:notice] = "Signed in successfully"
sign_in_and_redirect(:user, authentication.user)
elsif current_user
token = omniauth['credentials'].token
secret = omniauth['credentials'].token
current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'], :token => token, :secret => token_secret)
flash[:notice] = "Authentication successful"
redirect_to authentications_url
else
user = User.new
user.apply_omniauth(omniauth)
if user.save!
flash[:notice] = "Signed in successfully"
sign_in(:user, authentication.user)
else
session[:omniauth] = omniauth.except('extra')
redirect_to '/signup'
end
end
end
def destroy
@authentication = current_user.authentications.find(params[:id])
@authentication.destroy
flash[:notice] = "Successfully destroyed authentication"
redirect_to authentications_url
end
end
これが私の sessions_helper.rb です
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
current_user = user
end
def sign_in_and_redirect(user)
redirect_to root_path
end
これが私の sessions_controller.rb です
class SessionsController < ApplicationController
def create
user = User.find_by_email(params[:session][:email])
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_to root_url
else
flash.now[:error] = "Invalid email/password combination"
render 'new'
end
end
これが user.rb モデルです
class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation
has_secure_password
has_many :authentications
before_save { |user| user.email = user.email.downcase }
before_save :create_remember_token
before_validation :no_password_omniauth
validates_uniqueness_of :name, { case_sensitive: false }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
validates :password, length: { minimum: 6 }
validates :password_confirmation, presence: true
@called_omniauth = false
def apply_omniauth(omniauth)
authentications.build(:provider => omniauth['provider'],
:uid => omniauth['uid'],
:token => omniauth['credentials'].token,
:secret => omniauth['credentials'].secret)
@called_omniauth = true
self.email = "test@example.com"
self.name = omniauth['info']['name']
self.password = self.password_confirmation = "password"
end
def password_required
return false if @called_omniauth == true
(authentications.empty? || !password.blank?)
end
def twitter
unless @twitter_user
provider = self.authentications.find_by_provider('twitter')
@twitter_user = Twitter::Client.new(:oauth_token => provider.token, :oauth_token_secret => provider.secret) rescue nil
end
@twitter_user
end
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
def apply_twitter(omniauth)
if (extra = omniauth['extra']['user_hash'] rescue false)
# Example fetching extra data. Needs migration to User model:
# self.firstname = (extra['name'] rescue '')
end
end
def no_password_omniauth
self.password_digest = SecureRandom.urlsafe_base64 unless password_required
end
def hash_from_omniauth(omniauth)
{
:provider => omniauth['provider'],
:uid => omniauth['uid'],
:token => omniauth['credentials']['token'],
:secret => omniauth['credentials']['secret']
}
end
end
最後に、ここに users_controller.rb があります
class UsersController < ApplicationController
before_filter :signed_in_user,
only: [:index, :edit, :update, :destroy]
before_filter :correct_user, only: [:edit, :update]
before_filter :admin_user, only: :destroy
def create
@user = User.new(params[:user])
if @user.save
sign_in @user
flash[:success] = "Welcome"
redirect_to root_url
else
render 'new'
end
end
def edit
end