我正在尝试在用户注册时设置年龄限制,这样如果他们太年轻,他们就无法在我正在构建的应用上注册。
我不得不超越设计允许我将其他值传递给用户(例如:birth_date
)。但是我也想检查用户的年龄,这样如果他们太年轻,他们就无法使用该应用程序。
我所拥有的,以一种基本的方式运作,但它并不是我想要的。
<%= f.input :birth_date, required: true, start_year:1999 %>
在我的用户模型中,我创建了一些解决问题的方法,但最终我的问题是这些代码在注册过程中没有受到任何影响,这就是我需要一些帮助。如果有人可以看一眼我指向正确的方向,我将非常感激!
class User < ApplicationRecord
validate :age_restriction
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :cafes
def age_restriction
if (birth_date.to_date + 18.years) < Date.today # assuming dob format is mm/dd/yy
errors.add :birth_date, 'must be older than 18'
end
end
end
我过去设计的控制器我称之为registration_controller
,就像这样
class RegistrationsController < Devise::RegistrationsController
before_action :configure_sign_up_params, only: :create
before_action :configure_account_update_params, only: :update
protected
def configure_sign_up_params
devise_parameter_sanitizer.permit(:sign_up, keys: [:birth_date])
end
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys: [:bith_date])
end
end
我的初始控制器是我的user_controller。最初我希望这可以解决我的问题,但经过一些更多的工作意识到我需要超越设计(因此另一个registrations_controller
)。我承认这可能是导致我问题的原因,但不确定。
class UsersController < ActiveRecord::Base
def show
@user = User.find(params[:id])
end
def create
@user = current_user.build(user_params)
@user.save
end
private
def user_params
params.require(:user).permit(:birth_date)
end
end
答案 0 :(得分:0)
使用验证。
有一个gem添加了一些有用的日期验证器: https://github.com/adzap/validates_timeliness/
validates_date :date_of_birth, :before => lambda { 18.years.ago },
:before_message => "must be at least 18 years old"
答案 1 :(得分:0)
如果用户未达到您设置的年龄限制,您可以使用模型validations来阻止创建用户实例:
User.rb
validate :age_restriction
def age_restriction
if (birth_date.to_date + 18.years) < Date.today # assuming dob format is mm/dd/yy
errors.add :birth_date, 'must be older than 18'
end
end