0

我有一个带有地址列的普通用户模型。但是当一个人尝试使用电子邮件和密码注册时,他会收到错误消息:邮编地址和城镇不能为空。您只需要注册电子邮件和密码即可。如何修复用户创建?

用户模型:

class User < ActiveRecord::Base
      attr_accessible :zip, :state, :town, :address, :email, :password, :password_confirmation,

      attr_accessor :password
      validates_confirmation_of :password
      validates :email, presence: true, format: { with: VALID_E_REGEX }, uniqueness: { case_sensitive: false }
      validates :password, presence: true, format:{  with: VALID_P_REGEX }, if: proc{ password_salt.blank? || password_hash.blank? } 
      validates :zip, format: { with: VALID_ZIP_REGEX }
      validates :address, length: { minimum: 5 }
      validates :town, length: { minimum: 4 }
    end

用户控制器:

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      redirect_to root_url, :notice => "Signed up!"
    else
      render "new"
    end
  end 
end

错误:

!! #<ActiveRecord::RecordInvalid: Validation failed: Phone number is invalid, Zip is invalid, Address is too short (minimum is 5 characters), Town is too short (minimum is 4 characters)>
4

3 回答 3

2

这取决于您希望实际行为是什么。

  • 如果您不想验证额外的属性,只需按照 Vamsi 的说明删除它们的验证即可。

  • 如果您想验证额外的属性,但不是在创建用户对象时,您可以添加on: :update,如下所示:

    validates :zip, format: { with: VALID_ZIP_REGEX }, on: :update

  • 如果您想验证额外的属性,但只有在实际输入它们时,您可以allow_blank: true像这样添加(或者allow_nil,再次,取决于您的需要):

    validates :zip, format: { with: VALID_ZIP_REGEX }, allow_blank: true

有关验证及其选项的更多信息,请查看Active Record 验证指南

于 2013-10-08T10:14:25.533 回答
1

如何使验证有条件。

validates :address, length: { minimum: 5 }, if: :address
于 2013-10-08T10:11:59.390 回答
0

删除模型中不必要的验证。就如此容易...

如果您只想在值存在时使用它,您可以使用 validate 的 allow_nil 或 allow_blank 选项。或者您也可以使用 if 条件。

class User < ActiveRecord::Base
      attr_accessible :zip, :state, :town, :address, :email, :password, :password_confirmation,

      attr_accessor :password
      validates_confirmation_of :password
      validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
      validates :password, presence: true, format:{  with: VALID_PASSWORD_REGEX }, if: proc{ password_salt.blank? || password_hash.blank? }
      validates :zip, format: { with: VALID_ZIP_REGEX }, allow_blank: true
      validates :address, length: { minimum: 5 }, allow_blank: true
      validates :town, length: { minimum: 4 }, allow_blank: true
    end
于 2013-10-08T10:07:54.963 回答