2015-07-13 84 views
0

我正在使用rails的非營利組織的網站上工作。Rails無限循環當重定向到finish_singup

當用戶首次通過社交網絡(Facebook,Twitter)登錄時,我們遇到了問題。

在通過社交網絡在頁面上註冊時,頁面將用戶重定向到最終表單(finish_signup),用戶在其中填寫附加數據(郵件,性別,出生日期),但當用戶按下點擊繼續頁面重新將用戶重定向到結束表單(finish_singup)並因此停留在無限循環中。

這是控制檯告訴我,當用戶按下繼續

http://i.imgur.com/jWnjVHE.png

當我檢查的數據庫上我看到,問的最終形式(finish_singup)的額外信息,它不出現,只有當信息的「用戶按下點擊唱了嘰嘰喳喳

只有當我填寫所需要的數據(郵件,性別,出生日期)手動從我可以克服t時的數據庫他無限循環並將​​用戶重定向到主頁面。

這是我對home_controller.rb

class HomeController < ApplicationController 
    before_filter :user_has_signed_in 

    def index 
    logger.info request.headers['CustomHeader'] 
    end 

    private 
    def user_has_signed_in 
    if user_signed_in? 
     redirect_to main_path 
    end 
    end 
end 

而這就是我對user.rb模型

class User < ActiveRecord::Base 
    has_many :identities 
    has_many :session_ids 

    TEMP_EMAIL_PREFIX = '[email protected]' 
    TEMP_EMAIL_REGEX = /\[email protected]/ 

    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :confirmable, :recoverable, :registerable, :trackable, :timeoutable, :validatable, :omniauthable, omniauth_providers: [:facebook,:twitter] 

    validates_format_of :email, without: TEMP_EMAIL_REGEX, on: :update 

    has_many :reports, dependent: :destroy 
    has_many :affectation_votes 
    has_many :comments 
    has_many :likes 
    has_many :activity_records 

    validates :name, presence: true 
    validates :email, uniqueness: true 
    validates :username, uniqueness: true 
    #validates :gender, presence: true 
    #validates :birthdate, presence: true 
    has_attached_file :avatar 
    # validates_attachment :avatar, content_type: { content_type: ["image/jpeg", "image/gif", "image/png", "image/bmp"] }, size: { less_than: 1.megabytes } 
    do_not_validate_attachment_file_type :avatar 

    def avatar_url 
    omniauth_image || (avatar.url =~ /missing/ ? nil : avatar.url) 
    end 

    def report_count 
    reports.count 
    end 

    def comment_count 
    comments.count 
    end 

    def level 
    number_of_reports = reports.count 
    if number_of_reports >= 60 
     return 9 
    elsif number_of_reports >= 45 
     return 8 
    elsif number_of_reports >= 35 
     return 7 
    elsif number_of_reports >= 25 
     return 6 
    elsif number_of_reports >= 20 
     return 5 
    elsif number_of_reports >= 15 
     return 4 
    elsif number_of_reports >= 10 
     return 3 
    elsif number_of_reports >= 5 
     return 2 
    else 
     return 1 
    end 
    end 

    def since 
    created_at.strftime('%d/%m/%Y') 
    end 

    def get_uid_for_provider(provider) 
    if identities.count > 0 
     identities.find_by_provider(provider).uid 
    else 
     nil 
    end 
    end 

    def self.find_by_uid_for_provider(uid, provider) 
    identity = Identity.where(provider: provider, uid: uid) 
    if identity 
     identity.user 
    else 
     nil 
    end 
    end 

    def self.find_for_oauth(auth, signed_in_resource = nil) 

    # Get the identity and user if they exist 
    identity = Identity.find_for_oauth(auth) 

    # If a signed_in_resource is provided, it always overrides the existing user 
    # to prevent the identity beign locked with accidentally created accounts. 
    # Note that this may leave zombie accounts (with no associated identity) which 
    # can be cleaned up at a later date. 
    user = signed_in_resource ? signed_in_resource : identity.user 

    # Create the user if needed 
    if user.nil? 

     # Get the existing user by email if the provider gives us a verified email. 
     # If no verified email was provided we assign a temporary email and ask the 
     # user to verify it on the next step via UsersController.finish_signup 
     email_is_verfied = auth.info.email && (auth.info.verified || auth.info.verified_email) 
     email = auth.info.email if email_is_verfied 
     user = User.where(email: email).first if email 

     # Create the user if it is a new registration 
     if user.nil? 
      # logger.info auth 
      user = User.new(
      name: auth.extra.raw_info.name, 
      email: email ? email : "#{TEMP_EMAIL_PREFIX}-#{auth.uid}-#{auth.provider}.com", 
      password: Devise.friendly_token[0,20], 
      omniauth_image: auth.info.image 
     ) 
      user.skip_confirmation! 
      user.save! 
     end 
     end 

     # Associate the identity with the user if needed 
     if identity.user != user 
     identity.user = user 
     identity.save! 
     end 
     user 
    end 

    def email_verified? 
     self.email && self.email !~ TEMP_EMAIL_REGEX 
    end 

這是,如果你希望服務器的回購頁看看

https://github.com/denialtorres/YoCDDN/

我會很感激,如果我可以幫助這個。問候:)

+0

當您提交'finish_signup'表單時,您是否在控制檯中查看是否存在'unpermitted parameters:username'?簡而言之,您提交表單時存儲在數據庫中的用戶名? – Deep

+0

嗨!謝謝你的幫助。我沒有得到任何'不允許的參數:username'我只得到'過濾器鏈暫停爲:check_complete_user_data呈現或重定向'然後頁面再次在'finish_signup'上重新加載。即使我把它們放在窗體上,用戶名和郵件也不會存儲在數據庫中。這是它的外觀[link] http://i.imgur.com/AonrjZh.png [link]在控制檯上,我只能看到GET方法,但從來沒有PATCH或PUT,當我按**繼續** –

+0

請參閱答案和嘗試,應該幫助 – Deep

回答

0

在你users_controller您有:

def user_params 
     accessible = [ :name, :email ] # extend with your own params 
     accessible << [ :password, :password_confirmation ] unless params[:user][:password].blank? 
     params.require(:user).permit(accessible) 
end 

它不允許username進行保存。所以在before_filter

def check_complete_user_data 
    unless params['action'] =~ /finish_signup/ 
     if user_signed_in? 
     if current_user.username.nil? 
      redirect_to "https://stackoverflow.com/users/#{current_user.id}/finish_signup" 
     end 
     end 
    end 
    end 

你檢查,如果用戶名如果​​爲零,然後重定向到finish_signup路徑。所以只要允許username這個問題就會解決。就像這樣:

def user_params 
     accessible = [ :name, :email, :username ] # extend with your own params 
     accessible << [ :password, :password_confirmation ] unless params[:user][:password].blank? 
     params.require(:user).permit(accessible) 
end 

而且因爲你是深藏不露被存儲在此圖像中是因爲你不允許在強參數的任何屬性。

而當你檢查補丁請求,而不是發送一個,這樣使它爲:

<%= form_for(current_user, :as => 'user', :url => finish_signup_path(current_user), :method => :patch, :html => { role: 'form', onsubmit: 'return validateTerms()', class: 'form-horizontal'}) do |f| %> 

因此,這將發出一個patch請求。

希望這會有所幫助。

+0

非常感謝你! 這是問題所在。現在我可以填寫最終表格並直接進入主屏幕。現在,我甚至可以添加一個按鈕,通過谷歌進行歌唱。再次感謝你!我整整一週都陷入了這個問題:P。問候 –