2014-09-26 143 views
0

當我通過我的按鈕Twitter登錄身份驗證,我得到這個瀏覽器錯誤設計+ omniauth嘰嘰喳喳+認證表

The action 'new' could not be found for RegistrationsController

我創建了一個registrations_controller.rb來覆蓋一些方法的色器件控制器根據本指南http://www.orhancanceylan.com/rails-twitter-and-facebook-authentications-with-omniauth-and-devise/#comment-1375

對不起,代碼冗長。主要部分在authentications_controller.rb中的twitter方法中,在該方法的else部分中。

該代碼部分管理用戶何時沒有其他第三方登錄認證以前創建和未通過設計登錄。因此,必須在代碼的該部分中創建認證記錄和用戶記錄。但我收到錯誤。

有一個認證表,以便我可以添加其他omniauth策略。

如果不清楚,或需要更多信息,請告訴我如何改善問題。

的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 2014-09-26 07:15:58

回答

0

我是繼承了錯誤的控制器registrations_controller。

應該

class RegistrationsController < Devise::RegistrationsController

class RegistrationsController < ApplicationController

看出來,人=]