Rails 重定向到 finish_singup 时无限循环
Rails Infinite Loop when redirect to finish_singup
我正在使用 rails 为一家非营利组织开发网站。
当用户首次通过社交网络(facebook、twitter)登录时,我们遇到了问题。
在通过社交网络在页面上注册时,页面会将用户重定向到最终表单 (finish_signup),用户在其中填写其他数据(邮件、性别、出生日期) ) 但当用户点击 Continue 时,页面会将用户再次重定向到最终表单 (finish_singup),从而保持无限循环。
这是当用户按下 Continue
时控制台显示的内容
http://i.imgur.com/jWnjVHE.png
当我检查数据库时,我看到在最终表格 (finish_singup) 上要求的额外信息它没有出现,只有当用户点击“Sing 时的信息关注推特
只有当我从数据库中手动填写所需数据(邮件、性别、出生日期)时,我才能克服无限循环并将用户重定向到主页。
这是我在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/
如果我能在这方面提供帮助,我将不胜感激。问候 :)
在你的 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
请求。
希望这对您有所帮助。
我正在使用 rails 为一家非营利组织开发网站。
当用户首次通过社交网络(facebook、twitter)登录时,我们遇到了问题。
在通过社交网络在页面上注册时,页面会将用户重定向到最终表单 (finish_signup),用户在其中填写其他数据(邮件、性别、出生日期) ) 但当用户点击 Continue 时,页面会将用户再次重定向到最终表单 (finish_singup),从而保持无限循环。
这是当用户按下 Continue
时控制台显示的内容http://i.imgur.com/jWnjVHE.png
当我检查数据库时,我看到在最终表格 (finish_singup) 上要求的额外信息它没有出现,只有当用户点击“Sing 时的信息关注推特
只有当我从数据库中手动填写所需数据(邮件、性别、出生日期)时,我才能克服无限循环并将用户重定向到主页。
这是我在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/
如果我能在这方面提供帮助,我将不胜感激。问候 :)
在你的 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
请求。
希望这对您有所帮助。