重定向到finish_singup时Rails无限循环

时间:2015-07-13 03:01:36

标签: ruby-on-rails ruby facebook ruby-on-rails-3 devise

我正在使用rails在非营利组织的网站上工作。

当用户第一次通过社交网络(facebook,twitter)登录时,我们遇到了问题。

在通过社交网络在页面上注册时,页面会将用户重定向到最终表单(finish_signup),用户在其中填写其他数据(邮件,性别,出生日期),但是当用户按下时点击继续页面再次将用户重定向到结束表单(finish_singup),从而保持无限循环。

当用户按继续

时,控制台会显示此信息

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

当我查看数据库时,我看到最终表格上提到的额外信息(finish_singup)它没有出现,只有用户按下时点击的信息" 用twitter唱歌

只有当我从数据库手动填写所需数据(邮件,性别,出生日期)时,我才能克服无限循环并将​​用户重定向到主页面。

这就是我在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 = 'change@me'
  TEMP_EMAIL_REGEX = /\Achange@me/

  # 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

如果你想看一下,这是服务器的repo页面

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

如果我能在这方面提供帮助,我将非常感激。问候:)

1 个答案:

答案 0 :(得分: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 "/users/#{current_user.id}/finish_signup"
        end
      end
    end
  end

您已检查过,如果用户名为nil,则重定向到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请求。

希望这有帮助。

相关问题