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

时间:2017-10-14 08:41:12

标签: ruby-on-rails ruby validation devise

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

我已添加迁移功能,在名为用户的设计模型中添加名为 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个字符,即使它是。

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

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

我该怎么做?

我使用ruby 2.4.1和rails 5.1.4。谢谢。

2 个答案:

答案 0 :(得分:2)

您需要在强参数中允许username

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
  end
end

请关注https://github.com/plataformatec/devise#strong-parameters

  • 对于你的第二个问题:

您需要覆盖Email的设计验证 https://github.com/plataformatec/devise/wiki/How-to:-Use-a-custom-email-validator-with-Devise会帮助你,

关注Skip email validation in Devise

答案 1 :(得分:1)

你必须做至少四件事才能让它发挥作用:

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块中:

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

如果您尚未确定users.username上有唯一索引。

4。将参数列入白名单。

由于可配置性的原因,Devise中的Params白名单比平均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,评论非常好。