Использование помощников проверки правильности Rails: сообщение, но хотите его без указания имени столбца в сообщении
Использование помощников проверки правильности Rails -
validates_xxx_of :the_column, :message => "my message"
будет генерировать сообщение проверки:
the_column мое сообщение
Есть ли способ отключить включение имени столбца?
(замените xxx любым вспомогательным методом проверки)
Ответы
Ответ 1
Я знаю, что этот вопрос старый. Но только для справки, если кто-то другой наткнется на него, как я только что сделал.
По крайней мере, в Rails 3.0.x(не уверен в более ранних версиях) вы можете использовать ведущий ^, как указано RadBrad, без необходимости каких-либо камней/плагинов.
Ответ 2
Существует жемчужина сообщения об ошибке клиента, которая должна делать то, что вы хотите
https://github.com/jeremydurham/custom-err-msg
Это позволяет вам переопределить нормальную конструкцию сообщения и определить полное сообщение самостоятельно следующим образом:
: message = > "^ Ваш адрес электронной почты кажется довольно запутанным, повторите попытку"
Обратите внимание на символ ^, который указывает рельсам НЕ добавлять что-либо, просто используйте сообщение точно так, как определено, (кроме того, что он удаляет ^)
Если вы не поместите ведущий символ ^, тогда вы получите сообщение об ошибке, генерируемое обычными рельсами.
Ответ 3
Rails 4 ответ
Посмотрел код здесь:
https://github.com/rails/rails/blob/master/activemodel/lib/active_model/errors.rb#L374
Поэтому вы можете указать в файле en.yml:
en:
errors:
format: '%{message}'
Это означает, что вам нужно также установить полное сообщение об ошибке везде, но я предполагаю, что это предпочтительнее. Заметьте, и я нашел это запутанным, формат ошибок не находится в пространстве имен ActiveRecord, где я обычно помещал остальные сообщения об ошибках.
Ответ 4
Это лучшее объяснение, которое я мог найти.
http://adamhooper.com/eng/articles/5
По существу, в инициализаторе измените метод full_messages в ActiveRecord.Errors, чтобы возвращать полные предложения (not column_name, конкатенации сообщений), если вы даете атрибут: message в валидации.
Обновить. Если вы попробуете код Адама, вы должны использовать файл свойств en.yml, если он не будет работать должным образом. Вы можете либо сделать это, либо обойти его, изменив метод full_messages далее. Это работает для меня. Я добавил следующее в инициализатор (/imitializers/active_record_errors.rb)
if RAILS_GEM_VERSION =~ /^2\.3/
ActiveRecord::Errors.class_eval do
# Remove complicated logic
def full_messages
returning full_messages = [] do
@errors.each_key do |attr|
@errors[attr].each do |message|
next unless message
if attr == "base"
full_messages << message
elsif message =~ /^\^/
full_messages << $' #' Grabs the text after the '^'
else
attr_name = @base.class.human_attribute_name(attr)
full_messages << attr_name + I18n.t('activerecord.errors.format.separator', :default => ' ') + message
end
end
end
end
end
end
end
Адам также дает хорошие аргументы в пользу изменения Rails для поддержки этого для усилий по интернационализации.
Ответ 5
Способ, которым я это сделал, переопределял ВСЕ сообщения, а не использовал помощники формы Rails для отображения сообщений об ошибках.
Это похоже на большую работу, но на самом деле у нее есть хорошие преимущества. Вы получаете полный контроль над сообщением, а затем можете реализовать собственный построитель форм, который может помещать сообщения об ошибках в строку, что лучше для пользователя.
Вы используете его следующим образом:
validates_uniqueness_of :foobar, :message => "The foobar isn't unique."
Затем не используйте full_messages
при печати сообщения об ошибке.
Ответ 6
ссылка на rubyforge не работает, вот пример плагина сообщения об ошибке на github:
http://github.com/gumayunov/custom-err-msg
Ответ 7
Почему бы просто не использовать хеш @object.errors?!
Измените сообщения как есть в части проверки:
validates_uniqueness_of: foobar,: message = > "Фообар не уникален".
И затем,
@foo.errors.to_a
Вы получаете хороший массив, где вторая запись - это само сообщение об ошибке.
Ответ 8
В рельсах 2 вы можете сделать на своей модели:
validate :test_validation
private
def test_validation
if error_condition
errors.add_to_base("Message")
end
end
В рельсах 3 или более:
validate :test_validation
private
def test_validation
if error_condition
errors[:base] << "Message"
end
end
Ответ 9
У меня тоже была такая же проблема с RoR 3.0.3. Я не смог найти способ отображения сообщений проверки без имени атрибутов. Код, который Swards опубликовал ранее, не работал у меня, но это было хорошее начало.
Я разместил следующий код в файле RB в папках config/initializers:
ActiveModel::Errors.class_eval do
# Remove complicated logic
def full_messages
full_messages = []
each do |attribute, messages|
messages = Array.wrap(messages)
next if messages.empty?
if attribute == :base
messages.each {|m| full_messages << m }
else
attr_name = attribute.to_s.gsub('.', '_').humanize
attr_name = @base.class.human_attribute_name(
attribute,
:default => attr_name
)
options = { :default => "%{message}", :attribute => attr_name }
messages.each do |m|
full_messages << I18n.t(:"errors.format", options.merge(:message => m))
end
end
end
full_messages
end
end
Это удаляет имя атрибутов из всех сообщений, что именно то, что я хотел сделать.
Ответ 10
Я нашел этот ответ более полезным:
проверить уникальность между несколькими подклассами с наследованием одиночной таблицы
Ответ 11
Rails 3.2 надежное решение
Для тех, кто споткнулся здесь (и, возможно, прокрутил к нижней части), ища, как это сделать в более поздних версиях Rails, вот несколько хороших новостей для вас: это будет довольно просто сделать в Rails 4 после этого запрос на перенос. Для некоторых сценариев может потребоваться дополнительная полировка, но здесь был достигнут прогресс.
До тех пор вы можете использовать Rails в проекте с помощью запроса на вытягивание:)
class ActiveModel::Errors
def full_message(attribute, message)
return message if attribute == :base
attr_name = attribute.to_s.tr('.', '_').humanize
attr_name = @base.class.human_attribute_name(attribute, :default => attr_name)
I18n.t(:"errors.formats.attributes.#{attribute}", {
:default => [:"errors.format","%{attribute} %{message}"],
:attribute => attr_name,
:message => message
})
end
end
И добавьте следующее в свой файл локали:
en:
errors:
formats:
attributes:
name: '%{message}'
Ответ 12
Вот довольно простая реализация, которая должна сделать трюк. Примечательно, что это влияет только на одну модель (в отличие от большинства локальных трюков, которые я видел) и не слишком тяжело.... он просто изменяет один объект:
class Widget < ActiveRecord::Base
validates_numericality_of :quantity, greater_than: 0, message: "numericality"
def errors
super.tap do |e|
e.extend(FixQuantityErrorMessage)
end
end
module FixQuantityErrorMessage
def full_message(attribute, message)
if attribute.to_s == 'quantity' && message == "numericality"
"You need at least one!"
else
super
end
end
end
end