在Rails Admin中使用before_validation时,字段变为空白

时间:2017-05-24 07:56:00

标签: ruby-on-rails ruby windows rails-admin

我正在使用Rails Admin gem。当我添加一个新的活动类型并使用相同的名称再次创建它时,它会验证该名称是否已被采用。但每当我尝试编辑一个时,它都会给你一个错误:“名字不能为空”

例如,我创建了游泳,我尝试添加一个新的活动类型,即游泳/游泳等。为了避免这种情况,我使用before_validation回调,将第一个字母作为首都,然后检查name的唯一性。

是的,它正常运行,但每当我尝试编辑name字段时,我提交后都会变为空白。

注意:我也尝试仅使用validates :name, presence: true, :uniqueness => {:case_sensitive => true}而不使用before_validation,但它不起作用。

活动类型

class ActivityType < ApplicationRecord
  before_destroy :ensure_has_no_activity_type
  before_validation :capitalize_first_letter_name
  has_many :activities

  validates :name, presence: true,:uniqueness => {:case_sensitive => true}, length: { maximum: 20 },format: Utilities::RegexValidations.alphanumeric_underscore
  validates :description, presence: false

  private

  def ensure_has_no_activity_type
    if activities.present?
      errors.add(:base, 'Cannot delete activity type that has activity')
    throw(:abort)
    end
  end
  def capitalize_first_letter_name
    # Capitalize the first letter and the rest will be small letter
    self.name = self.name.capitalize!
  end

end

问题:为什么每当我尝试编辑并尝试提交时,名称字段是否会变为空白?这是什么原因?

1 个答案:

答案 0 :(得分:3)

问题来自于capitalize_first_letter_name"".capitalize!将返回nil。如果您将其更改为"".capitalize,将按预期返回空白字符串。

此外,如果未进行任何更改,capitalize!将返回nil。请参阅https://ruby-doc.org/core-2.2.0/String.html#method-i-capitalize-21