Rails Devise不会将FIRST_NAME和LAST_NAME写入我的数据库的用户表中,并且一直期望在每个名字和姓氏的末尾都有一个‘@url.tld’

wztqucjr  于 2022-10-15  发布在  Ruby
关注(0)|答案(2)|浏览(125)

我已经在我的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
yftpprvb

yftpprvb1#

好的,现在是2019年,我会给未来的人答案:
首先,您需要转到application_controller.rb文件,并将以下几行代码放入其中:

before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters

    devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit({ roles: [] }, :email, :password, :password_confirmation, :first_name, :last_name, :avatar) }
  end

只需写下你想要列出的参数。在我的例子中,它们是名字、姓氏和头像。
要进行进一步的研究,您可以阅读Rails上的强参数指南,也可以观看一段简短的视频
讲师用一种非常通俗易懂的方式进行解释。

mf98qq94

mf98qq942#

不知道你是否还在寻找解决方案,但对于任何未来的谷歌人来说:
我也有同样的问题,但我自己解决了。问题是表单将first_namelast_name字段列为email_field

<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>

它们应该是text_fields

<div class="field">
  <%= f.label :first_name %><br />
  <%= f.text_field :first_name %>
</div>

<div class="field">
  <%= f.label :last_name %><br />
  <%= f.text_field :last_name %>
</div>

相关问题