I 버튼 내 트위터 기호를 통해 인증, 나는 몇 가지 방법에 대한 유증 컨트롤러를 무시하는 registrations_controller.rb을 만들어이 브라우저 오류유증은 + omniauth 트위터 + 인증 테이블
The action 'new' could not be found for RegistrationsController
받고 있어요 이 가이드에 따르면 http://www.orhancanceylan.com/rails-twitter-and-facebook-authentications-with-omniauth-and-devise/#comment-1375
코드에 대해 자세히 설명해 드려 죄송합니다. 주요 부분은 twitter
메서드의 authentications_controller.rb
메서드, else
메서드 부분입니다.
사용자가 이전에 작성한 다른 제 3 자 로그인 인증을 가지고 있지 않고 개발자가 로그인하지 않은 경우 코드 부분에서 관리합니다. 따라서 코드의 해당 부분에 인증 레코드와 사용자 레코드를 작성해야합니다. 하지만 오류가 나타납니다.
다른 옴니아 전략을 추가 할 수 있도록 인증 테이블이 있습니다.
불분명하거나 자세한 내용이 필요하면 질문을 어떻게 개선 할 수 있는지 알려주십시오.
routes.rb
devise_for :users, :path => '',
:path_names => { :sign_in => "login",
:sign_out => "logout",
:sign_up => "sign-up",
:account_update => "account-settings" },
:controllers => { omniauth_callbacks: "authentications", registrations: "registrations" }
get "/auth/:provider/callback", to: "authentications#:provider"
authentications_controller.rb
class AuthenticationsController < Devise::OmniauthCallbacksController
def twitter
omni = request.env["omniauth.auth"]
authentication = Authentication.find_by_provider_and_uid(omni['provider'], omni['uid'])
if authentication
# If already registered previously
flash[:notice] = "Logged in successfully."
user = User.find(authentication.user_id)
sign_in_and_redirect user
elsif current_user
# If signed in via any other strategy, including devise.
current_user.authentications.create!(:provider => omni['provider'],
:uid => omni['uid'],
:token => token = omni['credentials']['token'],
:token_secret => omni['credentials']['secret'])
flash[:notice] = "Authentication successful."
sign_in_and_redirect current_user
else # this is the conditional that gets executed.
# If brand new to the site.
user = User.new
user.apply_omniauth(omni)
if user.save
flash[:notice] = "Login successful."
sign_in_and_redirect User.find(user.id)
else
session[:omniauth] = omni.except('extra')
redirect_to new_user_registration_path
end
end
end
# Overrides
def create
super
session[:omniauth] = nil unless @user.new_record?
end
end
authentication.rb
# == Schema Information
#
# Table name: authentications
#
# id :integer not null, primary key
# user_id :integer
# provider :string(255)
# uid :string(255)
# token :string(255)
# token_secret :string(255)
# profile_page :string(255)
# created_at :datetime
# updated_at :datetime
#
class Authentication < ActiveRecord::Base
belongs_to :user
end
#
user.rb
# == Schema Information
#
# Table name: users
#
# id :integer not null, primary key
# created_at :datetime
# updated_at :datetime
# email :string(255) default(""), not null
# encrypted_password :string(255) default(""), not null
# reset_password_token :string(255)
# reset_password_sent_at :datetime
# remember_created_at :datetime
# sign_in_count :integer default(0), not null
# current_sign_in_at :datetime
# last_sign_in_at :datetime
# current_sign_in_ip :inet
# last_sign_in_ip :inet
# username :string(255)
# admin :boolean default(FALSE)
# image :string(255)
# points :integer default(0), not null
# hacks_count :integer default(0), not null
# comment_threads_count :integer default(0), not null
#
# Indexes
#
# index_users_on_email (email) UNIQUE
# index_users_on_reset_password_token (reset_password_token) UNIQUE
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:omniauthable, omniauth_providers: [ :twitter ]
has_many :hacks
has_many :comments
acts_as_voter
has_many :authentications
validates :username,
presence: true,
:uniqueness => { case_sensitive: false },
length: { in: 4..20 }
#
SOCIALS = {
twitter: 'Twitter',
facebook: 'Facebook'
}
#
def apply_omniauth(omni)
authentications.build(:provider => omni['provider'],
:uid => omni['uid'],
:token => token = omni['credentials']['token'],
:token_secret => omni['credentials']['secret'])
end
# Overrides
def update_with_password(params, *options)
if encrypted_password.blank?
update_attributes(params, *options)
else
super
end
end
def password_required?
super && (authentications.empty? || !password.blank?)
end
end
당신은 오류 스택을 제공 할 수 있을까요? – Saurabh