Me preguntaba cómo validaría mejor las URL en Rails. Estaba pensando en usar una expresión regular, pero no estoy seguro de si esta es la mejor práctica.
Y, si tuviera que usar una expresión regular, ¿alguien podría sugerirme una? Todavía soy nuevo en Regex.
ruby-on-rails
ruby
regex
validation
url
arrendajo
fuente
fuente
Respuestas:
Validar una URL es un trabajo complicado. También es una solicitud muy amplia.
¿Qué quieres hacer exactamente? ¿Quieres validar el formato de la URL, la existencia o qué? Hay varias posibilidades, dependiendo de lo que quieras hacer.
Una expresión regular puede validar el formato de la URL. Pero incluso una expresión regular compleja no puede garantizar que esté tratando con una URL válida.
Por ejemplo, si toma una expresión regular simple, probablemente rechazará el siguiente host
pero permitirá
ese es un host válido, pero no un dominio válido si considera los TLD existentes. De hecho, la solución funcionaría si desea validar el nombre de host, no el dominio porque el siguiente es un nombre de host válido
así el siguiente
Ahora, déjame darte algunas soluciones.
Si desea validar un dominio, debe olvidarse de las expresiones regulares. La mejor solución disponible en este momento es la Lista de sufijos públicos, una lista mantenida por Mozilla. Creé una biblioteca Ruby para analizar y validar dominios en la lista de sufijos públicos, y se llama PublicSuffix .
Si desea validar el formato de un URI / URL, puede utilizar expresiones regulares. En lugar de buscar uno, use el
URI.parse
método Ruby incorporado .Incluso puedes decidir hacerlo más restrictivo. Por ejemplo, si desea que la URL sea una URL HTTP / HTTPS, puede hacer que la validación sea más precisa.
Por supuesto, hay toneladas de mejoras que puede aplicar a este método, incluida la comprobación de una ruta o un esquema.
Por último, pero no menos importante, también puede empaquetar este código en un validador:
fuente
URI::HTTPS
para https uris (ej:URI.parse("https://yo.com").class => URI::HTTPS
URI::HTTPS
hereda deURI:HTTP
, esa es la razón por la que usokind_of?
.URI.parse('http://invalid-host.foo')
devuelve verdadero porque ese URI es una URL válida. También tenga en cuenta que.foo
ahora es un TLD válido. iana.org/domains/root/db/foo.htmlYo uso un forro dentro de mis modelos:
validates :url, format: URI::regexp(%w[http https])
Creo que es lo suficientemente bueno y fácil de usar. Además, debería ser teóricamente equivalente al método de Simone, ya que utiliza la misma expresión regular internamente.
fuente
'http://'
coincide con el patrón anterior. Ver:URI::regexp(%w(http https)) =~ 'http://'
http:fake
será válida.Siguiendo la idea de Simone, puede crear fácilmente su propio validador.
y luego usar
en tu modelo
fuente
URI("http:").kind_of?(URI::HTTP) #=> true
También hay validate_url gem (que es solo un buen contenedor para la
Addressable::URI.parse
solución).Solo agrega
a tu
Gemfile
, y luego en modelos puedesfuente
Esta pregunta ya está respondida, pero qué diablos, propongo la solución que estoy usando.
La expresión regular funciona bien con todas las URL que he conocido. El método de establecimiento es tener cuidado si no se menciona ningún protocolo (supongamos que http: //).
Y finalmente, intentamos recuperar la página. Tal vez debería aceptar redireccionamientos y no solo HTTP 200 OK.
y...
fuente
También puede probar valid_url gem que permite URL sin el esquema, verifica la zona de dominio y los nombres de host de IP.
Agréguelo a su Gemfile:
gem 'valid_url'
Y luego en modelo:
fuente
Solo mis 2 centavos:
EDITAR: expresión regular modificada para que coincida con las URL de los parámetros.
fuente
http://test.com/fdsfsdf?a=b
La solución que funcionó para mí fue:
Intenté usar algunos de los ejemplos que adjuntaste, pero estoy apoyando la URL de esta manera:
Observe el uso de A y Z porque si usa ^ y $ verá esta advertencia de seguridad de los validadores de Rails.
fuente
"https://portal.example.com/portal/#"
. En Ruby 2.1.6 la evaluación se cuelga.Me encontré con el mismo problema últimamente (necesitaba validar las URL en una aplicación Rails) pero tuve que hacer frente al requisito adicional de las URL unicode (p. Ej.
http://кц.рф
) ...Investigué un par de soluciones y encontré lo siguiente:
URI.parse
. Verifique la respuesta de Simone Carletti para más detalles. Esto funciona bien, pero no para las URL unicode.URI.parse
pero que usa laaddressable
gema en lugar delURI
stdlib. Este enfoque se detalla aquí: http://rawsyntax.com/blog/url-validation-in-rails-3-and-ruby-in-general/fuente
Addressable::URI.parse('http:///').scheme # => "http"
oAddressable::URI.parse('Съешь [же] ещё этих мягких французских булок да выпей чаю')
están perfectamente bien desde el punto de vista deAquí hay una versión actualizada del validador publicado por David James . Ha sido publicado por Benjamin Fleischer . Mientras tanto, presioné un tenedor actualizado que se puede encontrar aquí .
...
Tenga en cuenta que todavía hay URI HTTP extraños que se analizan como direcciones válidas.
Aquí hay un problema para la
addressable
gema que cubre los ejemplos.fuente
Utilizo una ligera variación en la solución lafeber anterior . No permite puntos consecutivos en el nombre de host (como por ejemplo en
www.many...dots.com
):URI.parse
parece exigir el prefijo de esquema, que en algunos casos no es lo que puede desear (por ejemplo, si desea permitir que sus usuarios deletreen rápidamente URL en formas comotwitter.com/username
)fuente
He estado usando la gema 'activevalidators' y funciona bastante bien (no solo para la validación de URL)
puedes encontrarlo aquí
Todo está documentado, pero básicamente una vez que se agregó la gema, querrá agregar las siguientes líneas en un inicializador, por ejemplo: /config/environments/initializers/active_validators_activation.rb
(Nota: puede reemplazar: todo por: url o: lo que sea si solo desea validar tipos específicos de valores)
Y luego en tu modelo algo como esto
Ahora reinicie el servidor y eso debería ser
fuente
Si desea una validación simple y un mensaje de error personalizado:
fuente
Puede validar varias URL utilizando algo como:
fuente
https://github.com/perfectline/validates_url es una joya agradable y simple que hará casi todo por ti
fuente
Recientemente tuve este mismo problema y encontré una solución para las URL válidas.
La primera parte del método validate_url es suficiente para validar el formato url. La segunda parte se asegurará de que la URL exista enviando una solicitud.
fuente
Me gustó monopatch el módulo URI para agregar el válido? método
dentro
config/initializers/uri.rb
fuente
Y como un modulo
Y luego,
include UrlValidator
en cualquier modelo para el que desee validar las URL. Solo incluye opciones.fuente
La validación de URL no se puede manejar simplemente mediante el uso de una expresión regular, ya que el número de sitios web sigue creciendo y siguen apareciendo nuevos esquemas de nombres de dominio.
En mi caso, simplemente escribo un validador personalizado que busca una respuesta exitosa.
Estoy validando el
path
atributo de mi modelo usandorecord.path
. También estoy enviando el error al nombre del atributo respectivo usandorecord.errors[:path]
.Simplemente puede reemplazar esto con cualquier nombre de atributo.
Luego, simplemente llamo al validador personalizado en mi modelo.
fuente
Podrías usar regex para esto, para mí funciona bien este:
fuente