gpt4 book ai didi

ruby-on-rails - 对设计模型中的新字段进行自定义验证并使用相同的电子邮件地址创建多个用户

转载 作者:行者123 更新时间:2023-12-02 15:06:31 25 4
gpt4 key购买 nike

我是 Rails 的新手,我已经开始使用“Devise”gem 在示例 Rails 应用程序中构建身份验证功能。

我添加了一个迁移以在名为 User 的设计模型中添加一个名为 username 的新列。

我还添加了一些关于我创建的用户名列的验证,所以我的 user.rb 看起来像这样:

class User < ApplicationRecord

devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable


validates_presence_of :username
validates_uniqueness_of :username
validates_length_of :username, :minimum => 5, :maximum => 10
end

现在每次注册新用户时,我都会得到用户名的验证,即使它不应该。

例如,它告诉我用户名不应该为空,即使用户名已填写。

用户名至少应包含 5 个字符,尽管如此。

我做错了什么?在控制台中,我可以看到在表单提交期间在参数中传递的用户名以及:Unpermitted parameter :username

其次,我想使用相同的电子邮件地址但不同的用户名创建多个注册。

我该怎么做?

我使用的是 ruby​​ 2.4.1 和 rails 5.1.4。谢谢。

最佳答案

你必须至少做四件事才能让它工作:

1。设置适当的验证

由于您没有使用可验证模块,因此您应该确保正确验证用户:

class User < ApplicationRecord

devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable

validates_presence_of :email # optional
validates_presence_of :username # required
validates_uniqueness_of :username # required
validates_presence_of :password, if: :password_required? # recommended
validates_confirmation_of :password, if: :password_required? # recommended
validates_length_of :password, within: password_length, allow_blank: true # recommended
end

2。配置设计以使用 :username 而不是 :email 作为身份验证列:

# config/initializers/devise.rb
# ...
config.authentication_keys = [ :username ]
config.reset_password_keys = [ :username ]
config.confirmation_keys = [ :username ]

您可能需要在 config/initializers/devise.rb 中搜索 :email 以查找其他选项。

3。删除电子邮件的数据库唯一性约束:

生成一个新的迁移并将其放在 change block 中:

remove_index "users", name: "index_users_on_email"
add_index "users", "email", unique: false

如果您还没有确定您在 users.username 上有唯一索引。

4。将参数列入白名单。

由于可配置性,Devise 中的参数白名单比普通 Rails 资源要复杂一些。

您需要将 sign_up 和 sign_in 的用户名参数列入白名单:

class ApplicationController < ActionController::Base
# ...
before_action :configure_devise_parameters, if: :devise_controller?

# ...

private
def configure_devise_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
devise_parameter_sanitizer.permit(:sign_in, keys: [:username], except: [:email])
end
end

最好的引用是 reading the source这是非常好的评论。

关于ruby-on-rails - 对设计模型中的新字段进行自定义验证并使用相同的电子邮件地址创建多个用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46742588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com