2014-09-26 2 views
0

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 
+0

당신은 오류 스택을 제공 할 수 있을까요? – Saurabh

답변

0

내가 잘못 컨트롤러에서 registrations_controller 상속했다.

그것은

class RegistrationsController < Devise::RegistrationsController

class RegistrationsController < ApplicationController

이 사람을 조심하지해야 =]