我正在使用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/
如果我能在这方面提供帮助,我将非常感激。问候:)
答案 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
请求。
希望这有帮助。