00:10 – Geração de modelos com o Run Anything.
01:30 – Complementação automática de código.
02:35 – Go to definition.
04:06 – Documentação rápida.
04:36 – Complementação de código Postfix.
05:22 – Integração com RuboCop e ações de intenção (correções rápidas).
08:20 – Mostrar arquivos recentes/recentemente modificados.
09:04 – Verificador de RegExp.
09:58 – Popup File Structure.
10:39 – Opções de formatação de código e estilo de código.
12:10 – Go to related symbol (entidade Rails relacionada).
12:40 – Navegação entre métodos no editor.
12:51 – Refatoração: Extract Method.
14:15 – Refatoração: Rename.
15:50 – Múltiplos cursores.
Agora vamos criar um novo modelo e adicionar algum conteúdo para demonstrar as diferentes habilidades de edição de código do RubyMine. Para começar, vou pressionar Control duas vezes para abrir a ação Run Anything. Esta ação pode ser usada para executar quaisquer configurações, scripts, comandos, tarefas Rake, geradores Rails e até comandos de console.
Posso começar digitando algo como “rails g model” ou, em vez disso, poderia apenas inserir “Model” que o RubyMine entenderá que estou à procura de um gerador de modelos e irá sugeri-lo na lista de complementação.
Vou pressionar Enter para ver o wrapper de IU para o gerador de modelos. O mesmo que você vai descobrir para o controlador, migração e outros geradores.
Aqui posso fornecer o nome do meu modelo, que será Post, e seus campos: content: text (agora, como você pode ver, o RubyMine fornece complementação de dados de código para tipos de campo). Os outros campos serão “picture: string ”. Também posso fornecer opções adicionais. Vou ignorar e clicar OK.
O IDE vai executar o gerador, abrir a janela da ferramenta Run, mostrar o resultado do meu comando e permitir que eu navegue em todos os arquivos criados. Ele também vai abrir o arquivo de migração e o modelo post no editor por default.
Deixe-me fechar a janela da ferramenta Run e agora estou pronto para adicionar algum conteúdo ao meu modelo recém-criado. Vamos acrescentar algumas associações. Em primeiro lugar, vamos fazer com que nosso Post pertença ao usuário através da associação “belongs_to”.
À medida em que o RubyMine indexa sua aplicação em cada inicialização, ele posteriormente fornece uma série de recursos de Code Insight, tais como complementação automática de código para classes, métodos e outras entidades declaradas no seu aplicativo ou no Ruby, Rails e outros gems.
Portanto, é assim que você consegue a complementação automática, especificamente para o “belongs_to ”. Vamos autocompletá-lo. O RubyMine também é suficientemente inteligente para entender que estamos procurando por um modelo aqui e, de fato, estamos procurando o modelo do usuário, então vamos completá-lo automaticamente também.
A aplicação-exemplo usa o gem carrierwave para fazer o upload de fotos. E para associar imagens ao nosso modelo, precisaremos usar um método personalizado deste gem chamado “mount_uploader”. E, como você pode ver, como este gem é instalado para nossa aplicação, o RubyMine também sugere a complementação automática desse método.
A complementação automática de código não é o único recurso de Code Insight do RubyMine. Uma das habilidades mais importantes do RubyMine é a capacidade de navegar até a definição de qualquer entidade declarada dentro ou fora da sua aplicação. Por exemplo, podemos rapidamente navegar até a definição do modelo do usuário. Para isto, passamos o mouse sobre o nome do modelo e pressionamos Control ou Command, dependendo do seu sistema operacional, e depois clicamos nele.
Ok, agora passamos para o modelo e podemos adicionar uma associação aqui também. Da mesma forma, podemos navegar para a definição da associação “belongs_to” . Agora, passamos para o gem do registro ativo, o arquivo associations.rb. Deixe-me mostrar isso na janela da ferramenta Project.
Portanto, estamos do lado de fora da nossa aplicação e das bibliotecas externas, gem do registro ativo, arquivo association.rb. E, da mesma forma, podemos navegar até este método, que é o gem carrierwave ou o arquivo activerecord.rb, e assim por diante.
Agora vamos adicionar um método que verificará o tamanho da nossa imagem e retornará um erro se a imagem for grande demais. Vamos chamá-lo de picture_size: “picture.size > 5.megabytes”. Agora parece que tenho dois métodos semelhantes aqui. E se eu não tiver certeza de qual deles devo usar? Em vez procurar no Google por cada um desses métodos ou checar a documentação, posso pressionar F1 e ter rápido acesso à documentação de cada um desses métodos, diretamente no IDE.
Então o método megabytes retorna o número de bytes equivalente aos megabytes fornecidos e este é o método que estou procurando. E o segundo é apenas um alias para o primeiro, então posso usar qualquer um deles.
Agora, também parece que esqueci de transformá-la numa instrução if, mas em vez de voltar atrás no código, vou apenas inserir um ponto (.) E digitar if o que me permitirá empacotar esta linha com uma instrução if assim: “if picture.size> 5.megabytes”. Este recurso é chamado de “postfix code completion” e permite que você complemente, altere ou inverta suas instruções sem voltar atrás no código.
Você pode ver a lista de todos os modelos de código postfix nas configurações, tanto em JavaScript quanto em Ruby. Você também pode descobrir como eles vão ficar, e ativar e desativar os que você quiser.
Ok, vamos agora concluir o método. Agora vamos reativar o RuboCop para ver se temos alguma violação de estilo de código no nosso arquivo. Aparentemente, temos algumas. Para ter uma descrição do erro em cada linha, você pode ir até a parte direita do editor e navegar para cada destaque. Você também pode passar o mouse sobre o texto destacado e ver a descrição do erro que aparece lá.
Finalmente, se você não quiser usar o mouse, você pode simplesmente pressionar F2 para saltar para cada erro seguinte no arquivo, e depois pressionar Command+F1 ou Control+F1 para ter a descrição do erro.
Nesse caso específico, o problema é que estou usando strings com aspas duplas em vez de strings com aspas simples. E para corrigir isto com RuboCop, posso pressionar Alt+Enter e corrigir todas as ofensas do RuboCop no arquivo, corrigi-las por tipo de ofensa ou por departamento cop. Vamos corrigir todos os problemas identificados pelo RuboCop neste arquivo.
Ótimo. Este problema desapareceu, mas ainda temos mais algumas outras questões. Em primeiro lugar, aqui temos uma declaração multi-linha, em vez de linha única. Infelizmente, o RuboCop não oferece uma solução rápida para essa questão, mas o RubyMine fornece.
Para acessá-la, pressione Alt+Enter novamente. E, como você pode ver, podemos converter a declaração para modificador, o que significa que podemos transformar esta instrução if numa instrução de uma única linha. Vamos pressionar Enter e, como você pode ver, o erro desaparece.
Ainda assim, temos alguns problemas chatos, de acordo com RuboCop. Primeiro, esta linha agora ficou longa demais. Outro problema é que não temos um comentário de documentação para nossa classe. Para resolver esses problemas, vamos criar um arquivo de configuração RuboCop adicional.
Para isto, iremos à raiz do nosso projeto onde criaremos um arquivo de configuração RuboCop, .rubocop.yml. O RubyMine vai nos perguntar se queremos adicionar o novo arquivo ao Git. Responderemos “Sim” por enquanto, mas exploraremos os recursos do VCS mais adiante.
Vamos acrescentar algumas regras adicionais para nos livrarmos dos problemas chatos. Voltemos ao modelo. Vou salvar o arquivo manualmente para poder aplicar as alterações mais rapidamente e, como vocês podem ver, o RubyMine respeita o arquivo de configuração do RuboCop e esses erros desaparecem.
Vamos ver o que mais o RubyMine pode fazer por nós. Você provavelmente já percebeu, aliás, que de alguma maneira eu consegui fechar todos os arquivos, exceto o que está no momento aberto no editor. Para isto, passe o mouse sobre a aba, segure Alt e clique no botão Close. Agora você se livrou de todos os arquivos, exceto o que está aberto no editor, mas eu vou fechar esse arquivo por enquanto, já que não preciso mais dele. E vou fechar a janela da ferramenta Project também.
Agora, quero navegar até meu modelo de usuário. Para isto, posso usar outro pop-up, chamado Recent Files. Isto é Command+E ou Control+E, dependendo do seu sistema operacional. Ele permite que você navegue até os arquivos abertos recentemente. Como era de se esperar, a busca também funciona aqui, então posso fazer algo assim, mas o resultado é um pop-up semelhante chamado Recently Edited Files e, como você deve se lembrar, nós já editamos nosso modelo de usuário antes, pois acrescentamos nele uma associação. Então, podemos abri-lo daqui.
Antes, vamos polir algumas coisas. Aqui temos alguns problemas no RuboCop que podemos eliminar. E eis aqui outro bom caso de uso das ações de intenção no RubyMine. Temos uma expressão regular que verifica se um usuário fornece um endereço de e-mail válido. Então, para verificar esta expressão regular, pressionamos Alt+Enter novamente, escolhemos Check RegExp e fornecemos algumas expressões de teste. Este não corresponde. Este também não corresponde. Que tal algo como name@email.com? Ok. Este corresponde. Ótimo. Então, e assim que funciona.
Aqui também podemos substituir o nome da classe por self. Também podemos nos livrar deste operador ternário que deve ter sido usado para instruções multi-linha. Então, vamos transformá-lo numa instrução if/end.
Então temos um modelo um tanto espesso aqui. Para navegar entre seus métodos mais rapidamente, poderíamos usar o pop-up File Structure. Este pop-up permite que você navegue entre diferentes métodos de um arquivo e a busca também pode ser usada aqui. Podemos tentar navegar até alguns dos nossos métodos privados assim.
Como você pode ver, temos uma indentação extra para nossos métodos privados e, por default, o RuboCop considera isto uma violação do estilo de código. Então, eu editei meu arquivo de configuração para eliminar essa ofensa. O motivo pelo qual eu fiz isto é que muitos desenvolvedores preferem adicionar indentação extra para seus métodos privados e protegidos.
Quanto ao estilo de código, o RubyMine fornece um formatador de código embutido que reformata seu código de acordo com o Guia de Estilo Ruby e de acordo com algumas opções que você pode ajustar nas configurações.
Para reformatar seu código, você pode ir para Code | Reformat Code ou usar um atalho. Como você pode ver, o RubyMine reformatou nossos métodos privados e os deixou alinhados com o restante dos métodos.
A propósito, se você apenas escolher este método particular e selecionar a ação Reformat outra vez, o RubyMine irá reformatar apenas esta seleção particular.
O RubyMine recua nossos métodos privados é porque é isso que devemos fazer agora, de acordo com as configurações. Então, se você for nas configurações, procure o Code Style. Precisamos de uma para a linguagem Ruby. No entanto, o resultado é uma série de opções de estilo de código para diferentes linguagens e tecnologias. Mas aqui na seção Ruby, como você pode ver, podemos escolher se queremos adicionar um recuo extra para nossos métodos privados e protegidos. A tela Preview também mostra o que vai ser alterado.
Há também outras opções de estilo de código, por exemplo, você pode querer acrescentar espaços ao redor de hash-rockets, chaves nos blocos e hashes, além de algumas outras coisas.
Vamos apertar Apply e OK. Vamos reformatar nosso código novamente e, como você pode ver, agora o RubyMine acrescenta recuo extra para nossos métodos privados. Então é assim que o formatador de código funciona no RubyMine.
Vamos agora dar uma olhada em algumas outras coisas relacionadas ao usuário. Para isto, podemos ir para Navigate | Related Symbol..., que abre um pop-up mostrando todas as entidades relacionadas ao usuário. Então há um Controller de usuários, um Helper, uma série de views e testes. Vamos navegar até o Controller.
Aparentemente, aqui também temos vários problemas no RuboCop, como de costume. Vamos corrigir todos eles de uma vez. Temos diversas ações Rails aqui. A propósito, para navegar entre diferentes ações e métodos, você vai usar Control+⇧ e Control+⇩ ou Alt+⇧ e Alt+⇩ dependendo do sistema operacional.
Parece que muitas vezes fazemos a mesma coisa para diferentes ações. Encontramos um usuário no banco de dados através do seu ID e o atribuímos a uma variável de instância user. Em vez disso, por que não simplesmente refatorar esse trecho de código para incluí-lo num método próprio?
Para fazer isso, iremos ao menu Refactor e escolheremos o pop-up Refactor. Como você pode ver, o RubyMine oferece diversas refatorações diferentes. Por exemplo, você pode extrair variáveis, constantes, campos. Todas essas ações têm seus próprios atalhos. Vamos usar a refatoração Extract Method. Vamos clicar nela.
Podemos tornar o novo método privado, público ou protegido. Vamos deixá-lo privado. Também vamos criar um nome para ele: get_user. Clique em OK.
O RubyMine vai encontrar todas as ações que usam o mesmo trecho de código que acabamos de refatorar para seus métodos próprios. Se clicarmos em “Yes”, podemos aplicar o novo método a cada ação, um por um, ou a todos de uma vez.
Nosso novo método está localizado na seção private. Aqui está ele. Todas as ações do Rails usam o novo método ao invés do fragmento de código anterior. Mas ainda temos um pequeno problema aqui. Aparentemente, não deveríamos prefixar os métodos de leitura com get pois isto é uma violação do estilo de código. Precisaremos renomeá-lo.
Não precisamos fazer isto manualmente, já que o RubyMine também tem uma refatoração para isto, que é chamada de Rename. Então, se pressionarmos Shift+F6, podemos dar outro nome a este método, por exemplo, take_user. Aperte Refactor. RubyMine encontrará todos os usos e se clicarmos em do refactor, ele simplesmente renomeará o método em todos os seus usos.
Agora você pode ver que o método agora se chama take_user em todas as ações do Rail.
É provável que não vamos querer usar o mesmo método em algumas ações. Obviamente, é uma duplicação, então a única coisa que precisamos fazer é transformá-lo num filtro, um filtro before.
Vamos subir aqui e duplicar essa linha assim, Command+D ou Control+D, dependendo do seu sistema operacional. Vamos transformar este método em um filtro before. Agora a complementação de código está disponível para take_user, como você pode ver.
Eu não lembro de todas as ações que usam esse método, para que eu possa, manualmente, encontrar todos os seus usos de novo. Para fazer isto, tecle Alt+F7. Como você pode ver, as seguintes ações usam esta ação: edit, followers, following, show, e update. Ótimo. Vamos acrescentá-las.
Finalmente, agora podemos nos livrar de todas as ocorrências de take_user, pois não precisamos mais delas, já que agora temos um filtro before. Mas não precisamos fazer isto manualmente. Tudo o que precisamos fazer é selecionar uma ocorrência de take_user e depois apertar Control+G ou Alt+J dependendo do sistema operacional.
E depois clicar no atalho várias vezes até escolher todas as ocorrências de take_user no arquivo. No entanto, parece que também selecionamos a definição do método take_user, que provavelmente não queremos apagar. Então precisamos desfazer a seleção.
Para isto, usaremos o mesmo atalho, mas também teclaremos Shift. E agora tudo o que temos que fazer é pressionar Command+Backspace para eliminarmos todas as chamadas desnecessárias do método take_user.
Finalmente, vamos teclar escape para escapar de múltiplos cursores.