2014-09-26 100 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

看出来,人=]