validar tutorial rails formularios formulario español ejemplos descargar ruby-on-rails validation

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.



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.