пользовательское сообщение об ошибке для допустимого numericality в направляющих

Я хотел иметь пользовательские сообщения об ошибках для своих имен полей. Я наткнулся на другого ТАК вопрос

Таким образом, я добавил что-то вроде этого:

class Product < ActiveRecord::Base
  validate do |prod|
    prod.errors.add_to_base("Product price can't be blank") if prod.prod_price.blank?
  end
end

Но я также хочу проверить numericality prod_price. Если я просто добавляю validate_numericality_of :prod_price и цена продукта пуста затем оба, которых сообщения об ошибках разоблачают (пустой, и не число).

То, как я могу просто иметь, 'не является числом' сообщение об ошибке, обнаруживаются только, когда цена продукта не пуста?

Я пытался делать

class Product < ActiveRecord::Base
  validate do |prod|
    prod.errors.add_to_base("Product price can't be blank") if prod.prod_price.blank?
    if !prod.prod_price.blank?
       prod.errors.add_to_base("Product price must be a number") if prod.prod_price.
    end
  end
end

Кроме того, Как у меня может быть пользовательское сообщение для, 'не число'. Я хочу скрыть показ моего имени столбца пользователю.

9
задан Community 23 May 2017 в 12:24
поделиться

4 ответа

Вы можете получать пользовательские сообщения без написания собственного метода проверки. Просто добавьте :message:

validates_presence_of :prod_price, :message => "Цена товара не может быть пустой"

Если вы хотите пропустить проверку числовых значений при отсутствии prod_price, добавьте :allow_nil:

validates_presence_of :prod_price, :message => "Цена товара не может быть пустой" validates_numericality_of :prod_price, :allow_nil => true

Тогда проверка числовых значений не будет запущена, когда отсутствует prod_price.

EDIT:

Подождите, вы же не хотите, чтобы имя поля отображалось в сообщении об ошибке? Я пропустил это. Так что тебе все-таки понадобится пользовательская проверка.

EDIT #2:

Хорошо, тогда:

protected

def validate
  if prod_price.blank?
    errors.add "Product price can't be blank"
  else
    begin
      Integer(attributes_before_type_cast["prod_price"])
    rescue ArgumentError  
      errors.add "Product price must be a number"
    end
   end
end
5
ответ дан 4 December 2019 в 19:33
поделиться

по многим причинам, если вам не нужно делать что-то необычное, вы должны присоединять сообщения об ошибках к определенным полям (легче делать модульные тесты, проще модифицировать ошибки позже, вы можете отобразить Маркеры рядом с недействительными полями, если хотите, и т. Д.). Я думаю, что вы хотите сделать, может быть достигнуто с этим:

class Product < ActiveRecord::Base
  validates_numericality_of :name, :if => lambda{ |obj| obj.prod_price? }
  validates_presence_of :name
end
1
ответ дан 4 December 2019 в 19:33
поделиться
if prod.prod_price.blank?
  prod.errors.add_to_base("Product price can't be blank") 
elsif prod.prod_price.match(/[^\d]/)
  prod.errors.add_to_base("Product price must be a number")
end
0
ответ дан 4 December 2019 в 19:33
поделиться

Я взял этот подход из другого вопроса по SO

class User < ActiveRecord::Base

  HUMANIZED_ATTRIBUTES = {
    :email => "E-mail address"
  }

  def self.human_attribute_name(attr)
    HUMANIZED_ATTRIBUTES[attr.to_sym] || super
  end

end

, так что мне не нужно писать пользовательское сообщение для каждого поля. Я просто меняю имя fild, представленное пользователю

.
0
ответ дан 4 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: