00:10 – Generar un modelo con Run Anything.
01:30 – Finalización de código.
02:35 – Ir a la definición.
04:06 – Documentación rápida.
04:36 – Finalización de código postfix.
05:22 – Integración con RuboCop y acciones de intención (arreglos rápidos).
08:20 – Mostrar archivos recientes o editados recientemente.
09:04 – Corrector de RegExp.
09:58 – Ventana emergente de estructura de archivos.
10:39 – Formateador de código y opciones de estilo de código.
12:10 – Ir al símbolo relacionado (entidad de Rails relacionada).
12:40 – Navegar entre métodos en el editor.
12:51 – Refactorización: extraer método.
14:15 – Refactorización: cambiar nombre.
15:50 – Cursores múltiples.
Vamos a crear un modelo nuevo y le añadiremos algo de contenido para que vea diferentes capacidades de edición de código de RubyMine. Para empezar, pulsaré dos veces Control para abrir la acción Run Anything. Esta acción puede utilizarse para ejecutar cualquier configuración, script, comando, tareas Rake, generadores Rails e incluso comandos de la consola.
Puedo comenzar tecleando algo como “rails g model”, o puedo insertar “Model” y RubyMine comprenderá que estoy buscando un generador de modelos y lo sugerirá en la lista de finalización.
Pulsaré Enter y veré el contenedor de interfaz para el generador de modelos. El mismo que verá para el controlador, la migración y otros generadores.
Aquí puedo indicar el nombre de mi modelo, que será Post, y sus campos: contenido: texto (ahora, como ve, RubyMine ofrece finalización de datos de código para los tipos de campo). Los otros campos serán “imagen: cadena”. También puedo indicar otras opciones. Me lo saltaré y pulsaré OK.
El IDE ejecutará el generador, abrirá la ventana de herramientas Run, mostrará el resultado de mi comando y me permitirá navegar por cada uno de los archivos creados. También abrirá el archivo de migración y el modelo de post en el editor de forma predeterminada.
Voy a cerrar la ventana de herramientas Run y ya estoy listo para añadir algo de contenido a mi modelo recién creado. Ahora incorporemos un par de asociaciones. En primer lugar, asignemos nuestro Post a un usuario a través de la asociación “belongs_to”.
Como RubyMine indexa su aplicación cada vez que lo inicia, más adelante le ofrece una serie de funcionalidades de Code Insight, como finalización de código para clases, métodos y otras entidades declaradas en su aplicación o en Ruby, Rails y otras gemas.
Así es como se obtiene finalización para “belongs_to” en particular. Vamos a autocompletarlo. RubyMine también es lo suficientemente inteligente como para saber que estamos buscando un modelo, y sin duda estamos buscando el modelo de usuario, así que autocompletémoslo también.
La app de muestra utiliza la gema carrierwave para cargar imágenes. Y para asociar imágenes con nuestro modelo, tendremos que utilizar un método personalizado desde esta gema llamado “mount_uploader”. Y como puede ver, cuando esta gema está instalada para su aplicación, RubyMine sugiere autocompletar también este método.
La finalización de código no es la única funcionalidad de Code Insight de RubyMine. Una de las capacidades más importantes de RubyMine es la posibilidad de navegar a la definición de cualquier entidad declarada dentro o fuera de su aplicación. Por ejemplo, puede navegar rápidamente a la definición del modelo de usuario. Para ello, pasamos por encima del nombre del modelo pulsamos Control o Comando dependiendo de su sistema operativo, y hacemos clic sobre él.
Vale, ahora pasamos al modelo y aquí podemos añadir también una asociación. Del mismo modo, podemos navegar a la definición de la asociación “belongs_to” . Y ahora pasamos a la gema de registro activo, archivo associations.rb. Voy a mostrárselo en la ventana de proyecto Project.
Así que estamos fuera de nuestra aplicación y las bibliotecas externas, gema de registro activo, archivo associations.rb. Del mismo modo, podemos navegar a este método, que es la gema carrierwave, o el archivo activerecord.rb, etc.
Ahora añadamos un método que comprobará el tamaño de nuestra imagen y dará un error si es demasiado grande. Lo llamaremos picture_size: “picture.size > 5.megabytes”. Ahora parece que tengo dos método similares aquí. ¿Qué pasa si no estoy seguro de cuál usar? En lugar de buscar en Google cada uno de estos métodos o comprobar la documentación, puedo pulsar F1 y ver documentos rápidos para cada uno de estos métodos directamente en el IDE.
Así, el método megabytes devuelve el número de bytes equivalente a los megabytes existentes, y este es el método que busco. Y el segundo es solo un alias del primero, así que puedo utilizar cualquiera de estos.
Ahora también parece que me he olvidado de convertirlo en una declaración if, pero en lugar de volver al código, solo tengo que insertar un punto (.) y escribir if , lo que me permitirá envolver esta línea con una declaración if como esta: “if picture.size> 5.megabytes”. Esta funcionalidad se llama “finalización de código postfix” y le permite complementar, alterar o invertir sus declaraciones sin volver al código.
Puede ver la lista de todas las plantillas de código postfix en la configuración, tanto con JavaScript como con Ruby. También puede saber cuál será su aspecto, y habilitar y deshabilitar las que desee.
Vale, ahora terminemos el método. Vamos a permitir que RuboCop pueda ver de nuevo si hay algún incumplimiento del estilo de código en nuestro archivo. Parece que tenemos un par de incidencias. Para ver una descripción del error en cada línea, puede ir a la parte derecha del editor y navegar a cada texto resaltado. También puede pasar por encima del texto resaltado y ver ahí la descripción del error.
Por último, si no desea utilizar el ratón, puede pulsar F2 para ir a cada error siguiente del archivo y, a continuación, basta con pulsar Comando+F1 o Control+F1 para ver la descripción del error.
En este caso en particular, el problema es que estoy utilizando cadenas con comillas dobles en lugar de con comillas simples. Y para arreglarlo con RuboCop, puedo pulsar Alt+Enter y arreglar todos los problemas de RuboCop con el archivo por tipo de infracción o por departamento de Cop. Arreglemos todas las incidencias de RuboCop de este archivo.
Genial. Este problema desaparece, pero todavía nos quedan un par de incidencias. En primer lugar, aquí tenemos una declaración multilínea en lugar de monolínea. Desafortunadamente, RuboCop no cuenta con un arreglo rápido para esto, pero RubyMine sí.
Para acceder a él, pulse Alt +Enter de nuevo. Y, como puede ver, podemos compartir la declaración en modificador, lo que significa que podemos hacer de esta declaración if una declaración monolínea. Pulsemos Enter y, como ve, este error desaparece.
Pero RuboCop dice que aún nos quedan un par de molestas incidencias. En primer lugar, esta línea ahora es demasiado larga. Otro problema es que no tenemos un comentario de documentación para nuestra clase. Para resolver estas incidencias, creemos un archivo de configuración de RuboCop adicional.
Para ello, iremos a la raíz de nuestro proyecto y crearemos un archivo de configuración RuboCop .rubocop.yml. RubyMine nos preguntará si deseamos añadir al nuevo archivo a Git. Pulsaremos “Yes” por ahora, pero más delante descubriremos funcionalidades de VCS.
Añadamos algunas reglas más para deshacernos de las molestas incidencias. Volvamos al modelo. Voy a guardar manualmente el archivo para aplicar los cambios más rápido y, como ve, RubyMine respeta el archivo de configuración RuboCop para que desaparezcan estos errores.
Veamos qué más puede hacer por nosotros RubyMine. Por cierto, probablemente se haya dado cuenta de que he podido cerrar todos los archivos excepto el que tengo abierto en el editor. Para ello, pase por la pestaña, mantenga pulsado Alt y haga clic en el botón Close. Ahora ya nos hemos deshecho de todos los archivos excepto del que está abierto en el editor, pero voy a cerrar este también por ahora porque ya no lo necesito. Y cerraré también la ventana de herramientas Project.
Ahora quiero navegar a mi modelo de usuario. Para ello, puedo utilizar otra práctica ventana emergente denominada Recent Files. Utilice Comando+E o Control+E, dependiendo de su sistema operativo. Esto le permite navegar a los archivos abiertos recientemente. Como suponíamos, la búsqueda también funciona aquí, así que puedo hacer algo así, pero el resultado es una ventana emergente similar denominada Recently Edited Files y, como recordará, hemos editado nuestro modelo de usuario anteriormente, al añadirle una asociación. Así que podemos abrirlo desde aquí.
Comencemos por pulir un par de cosas. Aquí tenemos un par de incidencias de RuboCop de las que podemos deshacernos. Y aquí tenemos otra buena ocasión de utilizar las acciones de intención de RubyMine. Aquí tenemos una expresión regular que comprueba si un usuario ha indicado una dirección de correo electrónico válida. Para comprobar esta expresión regular, podemos pulsar Alt+Enter de nuevo y seleccionar Check RegExp para luego incorporar algunas muestras. Esta no coincide. Esta tampoco coincide. ¿Qué tal algo como name@email.com? Vale. Esta coincide. Estupendo. Así es como funciona.
Aquí también podemos sustituir el nombre de clase por self. Y deshagámonos de este operador ternario de aquí que debería haberse utilizado para declaraciones multilínea. Vamos a convertirlo en una declaración if/end.
De algún modo, aquí tenemos un modelo espeso y, para navegar más rápido entre sus métodos, podemos utilizar la ventana emergente File Structure. Esta ventana le permite navegar entre distintos métodos de un archivo, y en ella también funciona la búsqueda. Podemos intentar ir a alguno de nuestros métodos privados así.
Como ve, tenemos una sangría adicional para nuestros métodos privados y, de forma predeterminada, RuboCop considera esto un incumplimiento del estilo de código. Por eso he editado mi archivo de configuración para eliminar esta infracción. Lo he hecho porque, realmente, muchos desarrolladores prefieren añadir sangría adicional a sus métodos privados y protegidos.
En cuanto al estilo de código, RubyMine ofrece un formateador de código integrado que reformatea su código según la guía de estilo de Ruby y de acuerdo con algunas opciones que puede personalizar en la configuración.
Para reformatear su código, puede ir a Code| Reformat Code o utilizar un atajo. Como ve, RubyMine ha reformateado nuestros métodos privados y los ha alineado con los demás métodos.
Por cierto, si solo selecciona este método en particular y pulsa de nuevo la acción Reformat, RubyMine solo reformateará esta selección en particular.
El motivo por el que RubyMiine añade una sangría a nuestros métodos privados es porque así lo ordena la configuración. Así que, si va a la configuración, busque Code Style. Necesitamos uno para el lenguaje Ruby. Sin embargo, el resultado es una serie de opciones de estilo de código para distintos lenguajes y tecnologías. Pero aquí, en la sección Ruby, como ve, podemos escoger si deseamos añadir una sangría adicional a nuestros métodos privados y protegidos, y el panel de vista previa Preview también le muestra qué es lo que va a cambiar.
También hay otras opciones de estilo de código. Por ejemplo, puede añadir espacios en torno a los hash rockets, llaves en bloques y hashes, entre otras cosas.
Pulsemos Apply y OK. Vamos a reformatear de nuevo nuestro código y, como ve, ahora RubyMine añade sangría extra a nuestros métodos privados. Así es como funciona el formateador de código en RubyMine.
Ahora echemos un vistazo a otras cosas relacionadas con el usuario. Para ello, podemos ir a Navigate | Related Symbol..., que abrirá una ventana emergente que mostrará todas las entidades relacionadas con el usuario. El usuario dispone de un controlador, una ayuda, varias vistas y pruebas. Vayamos a Controller.
Parece que tenemos varias incidencias de RuboCop aquí, como es habitual. Vamos a solucionarlas todas a la vez. Aquí tenemos varias acciones de Rails. Por cierto, para navegar entre las distintas acciones y métodos, utilice Control+⇧ y Control+⇩ o Alt+⇧ y Alt+⇩, dependiendo del sistema operativo.
Parece que a menudo hacemos lo mismo para diferentes acciones. Buscamos a un usuario en la base de datos por su IDE y lo asignamos a una variable de instancia user. En lugar de ello, ¿por qué no refactorizamos este fragmento de código con su propio método.
Para esto, iremos al menú Refactor y seleccionaremos la ventana emergente Refactor. Como ve, RubyMine ofrece numerosas refactorizaciones distintas. Por ejemplo, puede extraer variables, constantes o campos. Todas estas acciones tienen sus propios atajos. Utilizaremos la refactorización Extract Method. Hagamos clic en ella.
Podemos hacer que el nuevo método sea privado, público o protegido. Hagámoslo privado. También le vamos a dar un nombre, get_user. Haga clic en OK.
RubyMine encontrará todas las acciones que utilizan el mismo fragmento de código que acabamos de refactorizar a su propio método. Si hacemos clic en “Yes”, podemos aplicar el nuevo método a cada acción una por una, o a todas la vez.
Ahora, nuestro nuevo método está situado directamente en el área privada. Aquí está, y todas las acciones de Rails utilizan el método nuevo en lugar del fragmento de código anterior. Sin embargo, aquí todavía tenemos un pequeño problema. Parece que no deberíamos usar el prefijo get para los métodos de lectura, puesto que es una infracción del estilo de código, así que tendremos que darle otro nombre.
No tenemos que hacerlo manualmente, puesto que RubyMine también cuenta con una refactorización para ello denominada Rename. Así que, si pulsamos Mayús+F6, podemos cambiar el nombre de este método por uno como, por ejemplo, take_user. Pulse Refactor. RubyMine encontrará todas sus utilizaciones y, si pulsamos do refactor, cambiará el nombre del método con todas sus utilizaciones.
Como puede ver, ahora este método se llama take_user en todas las acciones de Rail.
Por último, probablemente no deseemos utilizar el mismo método en muchas acciones. Así que, obviamente, existe una duplicación. No tenemos más que convertirla en un filtro, un filtro 'before'.
Subamos aquí arriba y dupliquemos esta línea con Comando+D o Control+D, dependiendo de su sistema operativo. Convirtamos este método en un filtro 'before'. Ahora, como verá, la finalización de código está disponible para take_user.
Ahora no recuerdo todas las acciones que utilizan este método, así que puedo buscar de nuevo manualmente todas sus utilizaciones. Para ello, pulsaré Alt+F7. Como ve, las siguentes acciones utilizan este ´metodo: edit, followers, following, show, y update. Genial. Añadámoslas.
Por último, ya podemos eliminar todas las ocurrencias de take_user porque ya no las necesitamos, puesto que ahora tenemos un filtro 'before'. Pero no tenemos que hacerlo manualmente. Solo tenemos que seleccionar una ocurrencia de take_user y pulsar Control+G o Alt+J dependiendo del sistema operativo.
A continuación, pulsaremos el atajo varias veces para seleccionar todas las ocurrencias de take_user en el archivo. Sin embargo, parece que también hemos seleccionado la definición del método take_user, que probablemente no queramos borrar. Tenemos que deseleccionarla.
Para ello, utilizaremos el mismo atajo, pero también pulsaremos Mayús. Ahora solo tenemos que pulsar Comando+Retroceso para eliminar todas las llamadas innecesarias del método take_user.
Por último, pulsemos Esc para salir de los múltiples cursores.