tutorial rails que ejemplos descargar curso caracteristicas ruby-on-rails ruby

ruby-on-rails - que - ruby on rails tutorial



Desbloquear cadenas largas en múltiples líneas en Ruby sin eliminar nuevas líneas (5)

Recientemente decidimos en mi trabajo una guía de estilo Ruby. Uno de los edictos es que ninguna línea debe tener más de 80 caracteres. Dado que este es un proyecto de Rails, a menudo tenemos cadenas que son un poco más largas, es decir, "el usuario X quería enviarle un mensaje sobre la cosa Y" que no siempre encaja dentro del límite de 80 caracteres.

Entiendo que hay tres formas de tener un largo de cadena de varias líneas:

  • HEREDOC
  • % Q {}
  • Concatenación real de cadenas.

Sin embargo, todos estos casos terminan tomando más ciclos de computación, lo que parece tonto. Concatenación de cadenas, obviamente, pero para HEREDOC y% QI tengo que eliminar las nuevas líneas, a través de algo como .gsub (/ / n $ /, '''').

¿Hay una forma de sintaxis pura para hacer esto, que es equivalente a simplemente tener toda la cadena en una línea? El objetivo es, obviamente, no gastar ningún ciclo extra solo porque quiero que mi código sea un poco más legible. (Sí, me doy cuenta de que tienes que hacer mucho daño ... pero para la longitud de la cuerda, esto parece una tontería).

Actualización: las barras diagonales inversas no son exactamente lo que quiero porque se pierde la sangría, lo que realmente afecta el estilo / legibilidad.

Ejemplo:

if foo string = "this is a / string that spans lines" end

Encuentro que lo anterior es un poco difícil de leer.

EDITAR : Agregué una respuesta a continuación; tres años más tarde ahora tenemos el squiggly heredoc.


Puede usar / para indicar que cualquier línea de Ruby continúa en la siguiente línea. Esto funciona con cadenas también:

string = "this is a / string that spans lines" puts string.inspect

saldrá "this is a string that spans lines"


Tal vez esto es lo que estás buscando?

string = "line #1"/ "line #2"/ "line #3" p string # => "line #1line #2line #3"


Tres años después, ahora hay una solución en Ruby 2.3: The squiggly heredoc.

class Subscription def warning_message <<~HEREDOC Subscription expiring soon! Your free trial will expire in #{days_until_expiration} days. Please update your billing information. HEREDOC end end

Enlace de la publicación del blog: https://infinum.co/the-capsized-eight/articles/multiline-strings-ruby-2-3-0-the-squiggly-heredoc

La sangría de la línea menos sangrada se eliminará de cada línea del contenido.


Tuve este problema cuando intento escribir una url muy larga, los siguientes trabajos.

image_url = %w( http://minio.127.0.0.1.xip.io:9000/ bucket29/docs/b7cfab0e-0119-452c-b262-1b78e3fccf38/ 28ed3774-b234-4de2-9a11-7d657707f79c? X-Amz-Algorithm=AWS4-HMAC-SHA256& X-Amz-Credential=AJAKJFAFGAKAJDDAF %2Fus-east-1%2Fs3%2Faws4_request& X-Amz-Date=20170702T000940Z& X-Amz-Expires=3600&X-Amz-SignedHeaders=host& X-Amz-Signature=QEWKJRQJEWR813247812347FKFS KQWREJQ3108418324732o45o1324kldsfjasf ).join

Tenga en cuenta que no debe haber líneas nuevas, espacios en blanco cuando se forma la cadena url. Si desea nuevas líneas, entonces use HEREDOC.

Aquí tiene sangría para legibilidad, facilidad de modificación, sin las comillas y las barras invertidas en cada línea. El costo de unirse a las cadenas debe ser insignificante.


Modifiqué la respuesta de Zack porque quería espacios e interpolación, pero no nuevas líneas y uso:

%W[ It''s a nice day "#{name}" for a walk! ].join('' '')

donde name = ''fred'' esto produce ¡ It''s a nice day "fred" for a walk!