ruby on rails - tutorial - Usando ayudantes de validación de Rails: mensaje, pero deséalo sin enumerar el nombre de la columna en el mensaje
ruby on rails tutorial español (12)
Usando ayudantes de validación de Rails-
validates_xxx_of :the_column, :message => "my message"
generará un mensaje de validación:
the_column mi mensaje
¿Hay alguna manera de desactivar la inclusión del nombre de la columna? (sustituye xxx con cualquier método de ayuda de validación)
Rails 3.2 solución a prueba de futuro
Para aquellos que tropezaron aquí (y posiblemente se desplazaron hasta el final) buscando cómo hacerlo en las versiones posteriores de Rails, aquí hay algunas buenas noticias para usted: será bastante simple hacerlo en Rails 4 después de que se fusione esta solicitud de extracción . Es posible que necesite un pulido adicional para algunos escenarios, pero se ha avanzado aquí.
Hasta entonces, puedes colocar Monkeys Rails en tu proyecto con la solicitud de extracción :)
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
Y agregue lo siguiente a su archivo de configuración regional:
en:
errors:
formats:
attributes:
name: ''%{message}''
Rails 4 respuesta
Eché un vistazo al código aquí:
https://github.com/rails/rails/blob/master/activemodel/lib/active_model/errors.rb#L374
Por lo tanto, puede establecer en su archivo en.yml:
en:
errors:
format: ''%{message}''
Esto significa que también debe configurar el mensaje de error completo en cualquier otro lugar, pero supongo que es preferible. Note, y encontré esto confuso, el formato de errores no está en el espacio de nombres de ActiveRecord donde generalmente pongo el resto de mis mensajes de error.
¿Por qué no simplemente usar el hash @ object.errors?
Cambie los mensajes a medida que avanza en la parte de validación:
validates_uniqueness_of: foobar,: message => "El foobar no es único".
Y entonces,
@ foo.errors.to_a
Obtienes una buena matriz donde la segunda entrada es el mensaje de error.
Aquí hay una implementación bastante sencilla que debería hacer el truco. En particular, solo afecta a un solo modelo (a diferencia de la mayoría de los trucos basados en la configuración regional que he visto) y no es demasiado pesado ... solo modifica un único objeto:
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
En los carriles 2, puedes hacer en tu modelo:
validate :test_validation
private
def test_validation
if error_condition
errors.add_to_base("Message")
end
end
En los carriles 3 o superior:
validate :test_validation
private
def test_validation
if error_condition
errors[:base] << "Message"
end
end
Esta es la mejor explicación que pude encontrar.
http://adamhooper.com/eng/articles/5
Esencialmente, en un inicializador, cambie el método full_messages en ActiveRecord.Errors para devolver oraciones completas (no column_name, concatenaciones de mensajes) si otorga un atributo: message en la validación.
Actualización : si prueba el código de Adam, debe usar el archivo de propiedades en.yml; de lo contrario, no funcionará como se esperaba. Puede hacer esto o solucionarlo modificando aún más el método full_messages. Esto funciona para mí. Agregué lo siguiente a un inicializador (/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
Adam también presenta buenos argumentos para modificar Rails para apoyar esto en los esfuerzos de internacionalización.
Hay una gema de mensaje de error del cliente que debe hacer lo que usted desea
https://github.com/jeremydurham/custom-err-msg
Le permite anular la construcción normal del mensaje y definir el mensaje completo de esta manera:
: mensaje => "^ Tu dirección de correo electrónico parece un poco desordenada, inténtalo de nuevo"
Observe el carácter ^, que le indica a los rieles que NO debe prependir nada, solo use el mensaje tal como está definido (excepto que elimina el ^)
Si no coloca un ^ inicial, obtiene el mensaje de error generado por los rieles normales.
He encontrado esta respuesta más útil:
validar la singularidad entre múltiples subclases con herencia de una sola tabla
La forma en que lo hice fue anular TODOS los mensajes y no utilizar los ayudantes de formulario Rails para mostrar mensajes de error.
Esto parece mucho trabajo, pero en realidad tiene algunos buenos beneficios. Obtiene el control total del mensaje, y luego puede implementar un generador de formularios personalizado que puede poner los mensajes de error en línea, lo que es mejor para el usuario.
Lo usas así:
validates_uniqueness_of :foobar, :message => "The foobar isn''t unique."
Entonces no use full_messages
cuando imprima el mensaje de error.
Sé que esta pregunta es vieja. Pero solo como referencia en caso de que alguien más se tropiece con él como acabo de hacer.
Al menos en Rails 3.0.x (no estoy seguro acerca de las versiones anteriores), puede usar el ^ líder como se indica por RadBrad sin la necesidad de gemas / complementos.
Yo también tuve el mismo problema con RoR 3.0.3. No pude encontrar una manera de mostrar los mensajes de validación sin el nombre de los atributos. El código que Swards publicó anteriormente no me funcionó, pero fue un buen comienzo.
Coloqué el siguiente código en un archivo RB en las carpetas 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
Esto elimina el nombre de los atributos de todos los mensajes, que es exactamente lo que quería hacer.
el enlace a rubyforge no funciona, aquí está el complemento de mensaje de error personalizado en github: