我已经在我的Rails应用程序中实现了Devise,并且随着Omniauth的实现,我已经成功地实现了它,以便人们可以创建自己的本地帐户,或者可以使用他们的Facebook帐户通过社交身份验证创建帐户。
然而,我想收集人们的名字和姓氏以及他们的电子邮件地址。我不关心人们是否能够用他们的名字/姓氏登录,我只想强制我在注册时收集他们,无论是在Devise的“Create Account”表单中,还是通过询问Facebook API自动收集。
到目前为止,我的代码如下:
new.html.erb-设计/注册
这是标准的设计型注册表格,我已经手动修改,包括一个指向我的Facebook注册链接的链接,以及手动添加的名字和姓氏部分。它造成了两个问题:(1)出于某种原因,它要求电子邮件地址,如First_Name和Last_Name的验证,要求每个名字和姓氏都有一个‘@’符号,然后在后面加上一些Copy.tld。(2)即使在我将‘@fake.com’添加到每个名称的末尾并且新用户被写入数据库之后,它最终甚至没有将first_name和last_name的内容写入数据库。所以如果我在名字和姓氏后面添加‘@fake.com’,我就可以浏览表单并创建一个新用户,但这些名字甚至不会作为数据库行的一部分写入。
<h3><%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %></h3>
<h2>Sign up</h2>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>
<div class="field">
<%= f.label :first_name %><br />
<%= f.email_field :first_name %>
</div>
<div class="field">
<%= f.label :last_name %><br />
<%= f.email_field :last_name %>
</div>
<div class="field">
<%= f.label :password %>
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "off" %>
</div>
<div class="field">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "off" %>
</div>
<div class="actions">
<%= f.submit "Sign up" %>
</div>
<% end %>
<%= render "devise/shared/links" %>
这些是我的代码中其他相关的部分,我一直在拼命地试图修改它们,以使其中任何一项都能正常工作:
注册控制器-控制器/用户
这是Devise的自动生成注册控制器,我已经用我在网上找到的一些代码进行了修改,试图让它正常工作。它似乎并没有奏效:
class Users::RegistrationsController < Devise::RegistrationsController
private
def configure_devise_params
devise_parameter_sanitizer.for(:sign_up) do |u|
u.permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
devise_parameter_sanitizer.for(:account_update) do |u|
u.permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
end
注册控制器-控制器
这是我在网上找到的另一个教程的要求下生成的一个单独的“迁移控制器”,同样,它似乎对我没有任何作用:
class RegistrationsController < Devise::RegistrationsController
private
def sign_up_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
def account_update_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :current_password)
end
end
Omniauth回调控制器
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
# You need to implement the method below in your model (e.g. app/models/user.rb)
@user = User.from_omniauth(request.env["omniauth.auth"])
# if request.env["omniauth.auth"].info.email.blank?
# redirect_to "/users/auth/facebook?auth_type=rerequest&scope=email"
if @user.persisted?
sign_in_and_redirect @user
set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
else
session["devise.facebook_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
应用控制器
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
#the point of this is so that when a person logs in who had never submitted an entry, he is taken to the New Entry page, if he has submitted he is taken to the Index page (root path)
def after_sign_in_path_for(resource)
if current_user.entries.first
root_path
else
entries_new_path
end
end
private
def configure_devise_params
devise_parameter_sanitizer.for(:sign_up) do |u|
u.permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
devise_parameter_sanitizer.for(:account_update) do |u|
u.permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
end
end
路由
Rails.application.routes.draw do
devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }
#root url, specifically needed for Devise according to its instructions
root to: 'entries#index'
# devise_scope :user do
# get 'sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session
# end
#Entries routes
get "/moderations" => 'moderations#index'
get "/" => 'entries#index'
get "/entries" => 'entries#index'
get "/entries/new" => 'entries#new'
get "/entries/:id" =>'entries#show'
post "/entries" => 'entries#create'
post "/votes" => 'votes#create'
post "/moderations" => 'moderations#create'
end
2条答案
按热度按时间yftpprvb1#
好的,现在是2019年,我会给未来的人答案:
首先,您需要转到
application_controller.rb
文件,并将以下几行代码放入其中:只需写下你想要列出的参数。在我的例子中,它们是名字、姓氏和头像。
要进行进一步的研究,您可以阅读Rails上的强参数指南,也可以观看一段简短的视频
讲师用一种非常通俗易懂的方式进行解释。
mf98qq942#
不知道你是否还在寻找解决方案,但对于任何未来的谷歌人来说:
我也有同样的问题,但我自己解决了。问题是表单将
first_name
和last_name
字段列为email_field
:它们应该是
text_fields
: