在超越设计注册控制器

时间:2017-09-27 22:15:29

标签: ruby-on-rails devise

我正在尝试在用户注册时设置年龄限制,这样如果他们太年轻,他们就无法在我正在构建的应用上注册。

我不得不超越设计允许我将其他值传递给用户(例如: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

2 个答案:

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