Я хотел иметь пользовательские сообщения об ошибках для своих имен полей. Я наткнулся на другого ТАК вопрос
Таким образом, я добавил что-то вроде этого:
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
Кроме того, Как у меня может быть пользовательское сообщение для, 'не число'. Я хочу скрыть показ моего имени столбца пользователю.
Вы можете получать пользовательские сообщения без написания собственного метода проверки. Просто добавьте :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
по многим причинам, если вам не нужно делать что-то необычное, вы должны присоединять сообщения об ошибках к определенным полям (легче делать модульные тесты, проще модифицировать ошибки позже, вы можете отобразить Маркеры рядом с недействительными полями, если хотите, и т. Д.). Я думаю, что вы хотите сделать, может быть достигнуто с этим:
class Product < ActiveRecord::Base
validates_numericality_of :name, :if => lambda{ |obj| obj.prod_price? }
validates_presence_of :name
end
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
Я взял этот подход из другого вопроса по 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, представленное пользователю
.