<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Designa Blog - Medium]]></title>
        <description><![CDATA[Nosso espaço para aprender, ensinar e compartilhar. - Medium]]></description>
        <link>https://medium.com/designa-blog?source=rss----1ed512f0c98f---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Designa Blog - Medium</title>
            <link>https://medium.com/designa-blog?source=rss----1ed512f0c98f---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 07:53:09 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/designa-blog" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Unleashing Productivity]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/designa-blog/unleashing-productivity-bb99f9390d9d?source=rss----1ed512f0c98f---4"><img src="https://cdn-images-1.medium.com/max/2600/0*f1LlPB6jS3tY4ZqZ" width="6720"></a></p><p class="medium-feed-snippet">Embracing Asynchronous Communication for Superior Software Development</p><p class="medium-feed-link"><a href="https://medium.com/designa-blog/unleashing-productivity-bb99f9390d9d?source=rss----1ed512f0c98f---4">Continue reading on Designa Blog »</a></p></div>]]></description>
            <link>https://medium.com/designa-blog/unleashing-productivity-bb99f9390d9d?source=rss----1ed512f0c98f---4</link>
            <guid isPermaLink="false">https://medium.com/p/bb99f9390d9d</guid>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[remote-work]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[communication]]></category>
            <dc:creator><![CDATA[João Mateus Scarpa]]></dc:creator>
            <pubDate>Tue, 16 May 2023 19:53:37 GMT</pubDate>
            <atom:updated>2023-05-16T19:53:37.363Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Aprendendo Ruby on Rails #4: Hello World]]></title>
            <link>https://medium.com/designa-blog/aprendendo-ruby-on-rails-4-hello-world-936fcfce6937?source=rss----1ed512f0c98f---4</link>
            <guid isPermaLink="false">https://medium.com/p/936fcfce6937</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[learning-to-code]]></category>
            <category><![CDATA[ruby-on-rails]]></category>
            <dc:creator><![CDATA[João Mateus Scarpa]]></dc:creator>
            <pubDate>Wed, 18 Jan 2023 01:25:45 GMT</pubDate>
            <atom:updated>2023-05-15T15:48:10.680Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*jyPcUH_yLJsLe55w" /><figcaption>Photo by <a href="https://unsplash.com/pt/@lemonvlad?utm_source=medium&amp;utm_medium=referral">Vladislav Klapin</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Chegou a hora de juntar tudo o que aprendemos até aqui. Vamos juntar os conceitos que já aprendemos sobre Rotas e MVC e construirmos nossa primeira requisição. Este será um passo importante, pois será a primeira requisição que criaremos para a nossa aplicação e ela terá toda a base para as demais requisições.</p><p>Começaremos simples, nossa primeira requisição seguirá o modelo abaixo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7SDcM1485T_ZcAkcMkIauQ.png" /></figure><p>Faremos uma requisição do tipo <em>GET</em>, para o path <em>status,</em> que deverá ser processada pelo StatusController e por fim renderizar uma view. Mas antes de começarmos, vamos configurar o nosso ambiente.</p><h3>Configurando o ambiente</h3><p>Para configurar o nosso ambiente utilizaremos o<a href="https://blog.designa.com.br/introdu%C3%A7%C3%A3o-ao-docker-ec781baf20cc"> Docker</a>. Para isso precisaremos criar os seguintes arquivos:</p><p><strong>Dockerfile</strong></p><pre>FROM ruby:3.1.0-slim<br><br>RUN apt-get update &amp;&amp; apt-get install -y --no-install-recommends \\<br>    build-essential \\<br>    libpq-dev \\<br>    postgresql-client \\<br>    git \\<br>  &amp;&amp; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*<br><br>RUN gem install rails<br>WORKDIR /project<br><br>COPY Gemfile Gemfile.lock /project/<br>RUN bundle install<br><br>EXPOSE 3000<br><br>CMD [&quot;bundle&quot;, &quot;exec&quot;, &quot;rails&quot;, &quot;s&quot;, &quot;-b&quot;, &quot;0.0.0.0&quot;]</pre><p><strong>docker-compose.yml</strong></p><pre>version: &quot;3.1&quot;<br><br>services:<br>  app:<br>    container_name: blog-api<br>    image: blog-api<br>    build:<br>      context: .<br>      dockerfile: Dockerfile<br>    volumes:<br>      - ./:/project<br>      - gems:/.gems<br>    environment:<br>      - SECRET_KEY_BASE=development<br>      - RAILS_ENV=development<br>      - DATABASE_NAME=blog-api<br>      - DATABASE_HOST=postgres<br>      - DATABASE_USERNAME=postgres<br>      - DATABASE_PASSWORD=postgres<br>      - API_HOST=localhost:3000<br>    stdin_open: true<br>    tty: true<br>    ports:<br>      - 3000:3000<br>  postgres:<br>    image: postgres:13.0-alpine<br>    environment:<br>      POSTGRES_PASSWORD: postgres<br>    ports:<br>      - &quot;5432:5432&quot;<br>    volumes:<br>      - postgres:/var/lib/postgresql/data<br><br>volumes:<br>  postgres:<br>  gems:</pre><p>E mais dois arquivos vazios: Gemfile e Gemfile.lock. Esses arquivos serão substituídos futuramente.</p><p>Com todos os arquivos criados, dentro do mesmo diretório, podemos inicializar o nosso container com o seguinte comando:</p><pre>docker compose run app bash</pre><p>O comando acima irá nos conectar no container e quando estivermos conectado veremos algo assim:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/498/1*NDS8Z0rDZdLw7F0ouQaq-g.png" /><figcaption>Terminal conectado no terminal do Docker</figcaption></figure><p>No terminal iremos inserir os comando para gerar uma nova aplicação rails, com banco de dados PostgreSQL e em modo API:</p><pre>rails new . -d postgresql --api</pre><p>Agora iremos alterar o arquivo de configuração do nosso banco de dados que fica em <strong>config/database.yaml</strong></p><pre>default: &amp;default<br>  adapter: postgresql<br>  encoding: unicode<br>  pool: &lt;%= ENV.fetch(&quot;RAILS_MAX_THREADS&quot;) { 5 } %&gt;<br>  host: &lt;%= ENV.fetch(&quot;DATABASE_HOST&quot;) %&gt;<br>  database: &lt;%= ENV.fetch(&quot;DATABASE_NAME&quot;) %&gt;<br>  username: &lt;%= ENV.fetch(&quot;DATABASE_USERNAME&quot;) %&gt;<br>  password: &lt;%= ENV.fetch(&quot;DATABASE_PASSWORD&quot;) %&gt;<br><br>development:<br>  &lt;&lt;: *default<br><br>test:<br>  &lt;&lt;: *default<br><br>production:<br>  &lt;&lt;: *default</pre><p>Por fim, como último passo da configuração do nosso ambiente, iremos fazer uma limpeza no nosso <strong>Gemfile</strong>, deixando apenas as dependências que iremos utilizar:</p><pre>source &quot;https://rubygems.org&quot;<br>git_source(:github) { |repo| &quot;https://github.com/#{repo}.git&quot; }<br><br>ruby &quot;3.1.0&quot;<br><br>gem &quot;rails&quot;, &quot;~&gt; 7.0.4&quot;, &quot;&gt;= 7.0.4.1&quot;<br>gem &quot;pg&quot;, &quot;~&gt; 1.1&quot;<br>gem &quot;puma&quot;, &quot;~&gt; 5.0&quot;<br>gem &quot;jbuilder&quot;<br>gem &quot;bootsnap&quot;, require: false</pre><h3>Executando nossa aplicação</h3><p>Se tudo foi configurado corretamente, para executarmos nossa aplicação basta executarmos o seguinte comando:</p><pre>docker compose up</pre><p>Se tudo funcionar corretamente, você deverá ver a seguinte saída no terminal:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pyM4ZyhlCADg6P8kibF8dA.png" /></figure><p>Agora é hora de acessar a nossa aplicação no navegador no endereço<a href="http://localhost:3000/"> <strong>http://localhost:3000</strong></a> e deveremos encontrar a seguinte página:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KXoV34q28_GtZiG8WgFocA.png" /></figure><p>Aqui, nesta tela de erro, temos uma das lições mais importantes do desenvolvimento com Ruby on Rails: <strong>Leiam as mensagens de erro.</strong></p><p>Na mensagem acima podemos ler <em>“Não foi possível encontrar o banco de dados </em><strong><em>blog-api.”</em></strong> E mais abaixo instruções para cria-lo executando o comando <em>rails db:create</em> ou clicando no botão “<em>create database”</em>, que será a opção que utilizaremos.</p><p>Após clicar no botão, teremos a tela inicial do Ruby on Rails:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yfgty9CdJSrAdsQctX7XtA.png" /></figure><h3>Criando nossa requisição</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7SDcM1485T_ZcAkcMkIauQ.png" /></figure><p>Construiremos nossa aplicação seguindo o diagrama e os arquivos citados acima, começando pelo arquivo de rotas.</p><p><strong>Routes</strong></p><p>Como vimos no<a href="https://blog.designa.com.br/aprendendo-ruby-on-rails-3-rotas-849566e4d4b1"> artigo anterior</a>, nossas rotas são definidas no arquivo config/routes.rb, e temos inúmeras formas de defini-las. Vamos pelo caminho mais simples, escrevendo nossa primeira rota da seguinte forma:</p><pre>Rails.application.routes.draw do<br>  get &#39;/status&#39;, controller: :status, action: :index<br>end</pre><p>Seguindo as instruções acima, falamos para a nossa aplicação que ao acessarmos a url /status com um verbo GET (como o enviado pelo navegador). Queremos acessar o conteúdo da index do controller status.</p><p>Ao tentarmos acessar http://localhost:3000/status.json no navegador encontrarmos o nosso seguinte erro e uma pista para onde devemos seguir:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bLE5CtPgTMSmqens4vqwQA.png" /></figure><p>A mensagem de erro nos informa da ausência de uma constante (nesse caso uma classe) com o nome StatusController. Então vamos para ele.</p><p><strong>Controller</strong></p><p>Para criar o nosso controller teremos que obedecer algumas regras, chamadas de convenção, adotadas pelo framework. Muitas dessas convenções irão nos restringir e nos tirar o peso de algumas decisões, mas entenderemos melhor sobre elas ao longo do caminho, por hora é importante que saibamos as seguintes convenções:</p><ul><li>O controller deverá ser criado no diretório <em>app/controllers</em></li><li>O nome do arquivo do controller deve ter o sufixo <em>_controller </em>e terminar com a extensão .rb</li><li>Dentro deste arquivo deverá ter uma class com o mesmo nome do arquivo, mas escrita em <em>PascalCase</em>. Exemplo: se o arquivo se chamar <em>products_controller.rb </em>a classe deverá ser <em>ProductsController</em>; se o arquivo se chamar <em>home_controller.rb</em> a classe deverá ser <em>HomeController</em>.</li><li>O controller deverá herdar, direta ou indiretamente, da classe <em>ActionController</em></li></ul><p>Com essas regras em mente e já sabendo que o controller que queremos se chama <em>StatusController</em>, sabemos o nome do arquivo e onde ele deve ser criado. Aqui está o nosso arquivo <em>app/controllers/status_controller.rb </em>até o momento:</p><pre>class StatusController &lt; ApplicationController<br>end</pre><p>Note que neste caso herdamos da classe ApplicationController e ela herdará da class ActionController, nos dando espaço para modificações e implementação em um escopo maior.</p><p>Novamente ao tentarmos acessar a url no navegador iremos nos deparar com um outro erro, que nos indicará a próxima implementação a ser feita:</p><p>Uma action com o nome index não foi encontrada em nosso controller.</p><p><strong>Action</strong></p><p>Como vimos<a href="https://blog.designa.com.br/aprendendo-ruby-on-rails-2-arquitetura-mvc-e887ec0a0cbe"> neste artigo</a>, uma action é um método que pode ser chamado através de uma rota e é obrigatório que renderize uma resposta ao usuário. Então vamos voltar ao nosso controller e adicionar o seguinte bloco de código:</p><pre>class StatusController &lt; ApplicationController<br>  def index<br>    render json: { status: &#39;ok&#39; }<br>  end<br>end</pre><p>Com o marcador <em>def, </em>criamos um novo método, nomeado index e este retornará, em formato json, o objeto contendo a chave status e o valor ok. Acessando nossa página no navegador deveremos ter o conteúdo exibido corretamente desta vez.</p><p><strong>View</strong></p><p>Por fim, nos resta apenas substituirmos o método render utilizado acima, pela substituição de uma view propriamente dita. Uma view também tem algumas convenções:</p><ul><li>Deve ficar localizada em app/views/nome_do_controller/. Exemplo, no caso do controller ProductsController (products_controller.rb), suas views ficariam localizadas em app/views/products/; No caso do HomeController (home_controller.rb) suas views ficariam localizadas em app/views/home/</li><li>As views terão o mesmo nome da action que ela representa. No nosso exemplo, a action é a index do controller status, logo deve ficar em app/views/controllers/index.json.jbuilder</li><li>No caso das nossas views em json, elas terão duas extensões .json e .jbuilder. O<a href="https://github.com/rails/jbuilder"> JBuilder</a> é quem irá <strong>traduzir o</strong> nosso código Ruby para Json.</li></ul><p>Iremos remover a linha com a instrução <em>render </em>do nosso controller e nosso arquivo <em>app/views/status/index.json.jbuilder </em>ficará com o seguinte conteúdo:</p><pre>json.title &quot;Blog API&quot;<br>json.status :ok</pre><p>Ao acessar a URL, finalmente teremos nosso conteúdo renderizado, encerrando nosso primeiro ciclo Rota → Controller → View.</p><p>No próximo artigo iremos nos aprofundar um pouco mais nos controllers e conhecer um pouco do mágica do Ruby on Rails. Se você gostou deste texto, clique no link abaixo e receba uma notificação sempre que eu publicar um novo texto por aqui!</p><p><a href="https://jmscarpa.medium.com/subscribe">Get an email whenever João Mateus Scarpa publishes.</a></p><p>Se você tiver seguindo a série, tiver algum problema para seguir algum passo ou se quiser falar comigo, só enviar um e-mail para <strong>joao.scarpa@gmail.com</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=936fcfce6937" width="1" height="1" alt=""><hr><p><a href="https://medium.com/designa-blog/aprendendo-ruby-on-rails-4-hello-world-936fcfce6937">Aprendendo Ruby on Rails #4: Hello World</a> was originally published in <a href="https://medium.com/designa-blog">Designa Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Aprendendo Ruby on Rails #3: Rotas]]></title>
            <link>https://medium.com/designa-blog/aprendendo-ruby-on-rails-3-rotas-849566e4d4b1?source=rss----1ed512f0c98f---4</link>
            <guid isPermaLink="false">https://medium.com/p/849566e4d4b1</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[ruby-on-rails]]></category>
            <category><![CDATA[programação]]></category>
            <dc:creator><![CDATA[João Mateus Scarpa]]></dc:creator>
            <pubDate>Mon, 09 Jan 2023 10:55:05 GMT</pubDate>
            <atom:updated>2023-01-09T10:55:05.908Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ZIlCl1H-Ht8WxOpF" /><figcaption>Photo by <a href="https://unsplash.com/@chetoba?utm_source=medium&amp;utm_medium=referral">Walter &quot;CheToba&quot; De Boever</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>No último artigo desta série nos concentramos na arquitetura MVC e agora, chegou a hora de entendermos como podemos fazer as nossas requisições chegarem aos nossos models e controllers, e obtermos as nossas views como respostas.</p><p>Mapear URLs e requisições para dentro da nossa aplicação, da forma correta e para o lugar exato que desejamos, é uma habilidade imprescindível para nossa jornada como desenvolvedores web, afinal, toda a internet funciona através de requisições e rotas. Portanto, vamos entender o que são rotas e como elas funcionam no Ruby on Rails.</p><h3>O que são rotas?</h3><p>Uma rota é um mapeamento de uma URL e um verbo HTTP para uma ação de algum controller. Simples assim!</p><p>Quando uma URL é acessada através de um navegador, na maioria das vezes, estamos fazendo uma requisição do tipo GET (com o verbo HTTP GET), pois o nosso intuito é buscar informações em um servidor. Porém os verbos HTTPS são múltiplos e usados para funções específicas. Para esta série podemos nos focam nos seguintes verbos e funções apenas:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/684/1*zw4hbFHrIrwvo9m683k4wA.png" /></figure><p>Para cada rota que declaramos no Rails, precisaremos indicar, além do verbo e da url, qual ação a ela executar e para isso poderemos usar o conjunto controller + action. Por exemplo, quando o usuário entra em um URL /posts em um navegador, o Rails deve identificar a rota (GET + /posts) e enviar para o controller posts na action index , por exemplo.</p><p>Para as <em>actions</em>, aqui vale a dica das 7 ações “padrão”. Na maioria dos casos (99%) todas as nossas actions ficarão dentro do conjunto abaixo e raramente precisaremos de outras. São elas:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/618/1*PfeFDLzNqd2a4_LdK_FnSw.png" /></figure><h3>Criando rotas</h3><p>Nossas rotas serão definidas no arquivo config/routes.rb, onde possuímos muitas formas de declará-las. Podemos declarar a rota get ‘/posts’, to: ‘posts#index’ que mapeia a URL /posts para a ação index no controller posts, por exemplo, mas também podemos declará-la com a construção resources :posts, only: [:index], portanto neste momento não nos focaremos nas diferenças das declarações e buscaremos apenas seguir um dos caminhos e nos mantermos nele de forma constante.</p><p>Aqui estão algumas formas de definir a mesma rota:</p><pre># Utilizando resources<br>resources :posts, only: [:index]<br><br># Utilizando um bloco<br>controller :posts do<br>	get &#39;/posts&#39;, action: :index<br>end<br><br># Inline<br>get &#39;/posts&#39;, controller: :posts, action: :index<br>get &#39;/posts&#39;, to: &quot;posts#index&quot;</pre><p>Neste ponto já deve ter ficado claro, mas vale ressaltar que as rotas são extremamente importantes para o funcionamento da nossa aplicação, pois elas são como as veias do nosso corpo e as trilhas um chip de computador. Elas são quem definem o fluxo da aplicação e também quais as URLs que estarão disponíveis para o usuário, mas também podem ser usadas para monitoramento, automação e muito mais.</p><p>No próximo artigo, iremos criar nosso “Hello World”, juntando tudo o que aprendemos até aqui. Uniremos os conceitos fundamentais de Rotas e MVC para construirmos nossa primeira requisição. Este será um passo importante, pois será a primeira requisição que criaremos para a nossa aplicação e ela terá toda a base para as demais requisições. Por isso, é importante compreendermos ao máximo cada um dos conceitos abordados até aqui para que possamos criar uma aplicação robusta e eficiente.</p><p>Se você gostou deste texto, clique no link abaixo e receba uma notificação sempre que eu publicar um novo texto por aqui!</p><p><a href="https://jmscarpa.medium.com/subscribe">Get an email whenever João Mateus Scarpa publishes.</a></p><p>E se quiser falar comigo, só enviar um e-mail para <strong>joao.scarpa@gmail.com</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=849566e4d4b1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/designa-blog/aprendendo-ruby-on-rails-3-rotas-849566e4d4b1">Aprendendo Ruby on Rails #3: Rotas</a> was originally published in <a href="https://medium.com/designa-blog">Designa Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Aprendendo Ruby on Rails #2: Arquitetura MVC]]></title>
            <link>https://medium.com/designa-blog/aprendendo-ruby-on-rails-2-arquitetura-mvc-e887ec0a0cbe?source=rss----1ed512f0c98f---4</link>
            <guid isPermaLink="false">https://medium.com/p/e887ec0a0cbe</guid>
            <category><![CDATA[ruby-on-rails]]></category>
            <category><![CDATA[mvc]]></category>
            <category><![CDATA[programação]]></category>
            <dc:creator><![CDATA[João Mateus Scarpa]]></dc:creator>
            <pubDate>Mon, 09 Jan 2023 01:53:34 GMT</pubDate>
            <atom:updated>2023-01-09T01:53:34.184Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*s6s0Q-EtdS53rcGQ" /><figcaption>Photo by <a href="https://unsplash.com/@barrettward?utm_source=medium&amp;utm_medium=referral">Barrett Ward</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Na primeira publicação desta série vimos que o Ruby on Rails é um framework para desenvolvimento web que se baseia na arquitetura Model-View-Controller (MVC) que, como o nome sugere, divide a aplicação web em três partes: o modelo, a visualização e o controlador. Neste artigo, vamos nos concentrar no entendimento da arquitetura MVC e como ela se encaixa na estrutura do Ruby on Rails.</p><h3>Models</h3><p>O <em>Model </em>é, sem dúvida, um dos principais componentes da nossa aplicação. É a partir dele que aplicamos as validações e definimos os relacionamentos entre os nossos recursos, criamos regras de negócio e muito mais. Além disso, no Ruby on Rails, alguns <em>Models </em>podem estar vinculados direto ao nosso banco de dados através do ActiveRecord (O ORM padrão do Rails)</p><p>Um <em>Model </em>é definido por uma classe definida em um arquivo homônimo, criado dentro do diretório app/models. O arquivo abaixo poderia representar um modelo de usuários, por exemplo:</p><pre>class User<br>  attr_reader :username, :email<br>  <br>  def admin?<br>    # Apply some rule<br>  end<br>end</pre><h3>View</h3><p>Uma view, como o nome sugere, é responsável por exibir informações para os usuários. Ela pode ser usada para exibir informações em um formulário, produtos em uma página de detalhes, etc. Normalmente, as views são representadas por arquivos HTML, mas nesta série abordaremos a utilização do Ruby on Rails na criação de API’s, portanto nossas views serão representadas por arquivos JSON.</p><p>Todas as nossas views serão criadas em app/views dentro do diretório do seu respectivo controller.</p><h3>Controller</h3><p>Por fim, o controller é responsável por processar as solicitações do usuário e enviar as informações corretas para o model (quando necessário) e para a view, no retorno ao usuário. Um controller, por exemplo, pode ser o meio onde um formulário de cadastro de usuário será processado e salvo.</p><p>Eu particularmente gosto de pensar no controller como uma ponte entre as demais partes da aplicação, pois ele é o responsável por usar nossas requisições para os models e para as views. Nosso <em>controller </em>ficará dentro do diretório app/controllers.</p><p>Um controller também é representado por um classe, mas desta vez com um sufixo (Controller) em seu nome e no nome do arquivo e com uma herança predefinida (ele deve possuir o ActionController em sua cadeia de herança).</p><p>No exemplo abaixo o nosso controller herda de uma classe ApplicationController e essa classe herda diretamente do ActionController, fazendo assim nosso UsersController tê-lo em sua cadeia de herança:</p><pre>class UsersController &lt; ApplicationController<br>  #...Controller definition<br>end</pre><p>Dentro dos nossos controllers, existem dois tipos de métodos: os métodos comuns e as <strong>actions</strong>. Ambos possuem a mesma estrutura e definição, variando apenas em seu propósito. Uma action é um método que pode ser chamado através de uma rota e é obrigatório que renderize uma resposta.</p><p>A arquitetura MVC é a base fundamental da estrutura do Ruby on Rails. Compreender como cada parte se comunica é crucial para o desenvolvimento de aplicações web com Ruby on Rails. No próximo artigo iremos falar um pouco sobre as <strong>Rotas</strong> e entender um pouco mais sobre a arquitetura do Ruby on Rails e como podemos juntar todas essas peças para construir uma aplicação.</p><p>Se você gostou deste texto, clique no link abaixo e receba uma notificação sempre que eu publicar um novo texto por aqui!</p><p><a href="https://jmscarpa.medium.com/subscribe">Get an email whenever João Mateus Scarpa publishes.</a></p><p>E se quiser falar comigo, só enviar um e-mail para <strong>joao.scarpa@gmail.com</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e887ec0a0cbe" width="1" height="1" alt=""><hr><p><a href="https://medium.com/designa-blog/aprendendo-ruby-on-rails-2-arquitetura-mvc-e887ec0a0cbe">Aprendendo Ruby on Rails #2: Arquitetura MVC</a> was originally published in <a href="https://medium.com/designa-blog">Designa Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introdução ao Docker]]></title>
            <link>https://medium.com/designa-blog/introdu%C3%A7%C3%A3o-ao-docker-ec781baf20cc?source=rss----1ed512f0c98f---4</link>
            <guid isPermaLink="false">https://medium.com/p/ec781baf20cc</guid>
            <category><![CDATA[ruby-on-rails]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[João Mateus Scarpa]]></dc:creator>
            <pubDate>Wed, 04 Jan 2023 01:12:39 GMT</pubDate>
            <atom:updated>2023-01-05T11:53:16.593Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*tFH-gWJXeG4OUbxQ" /><figcaption>Photo by <a href="https://unsplash.com/@exdigy?utm_source=medium&amp;utm_medium=referral">Dominik Lückmann</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h4>O Docker é um dos mais populares sistemas de contêineres de software. Ele permite que os desenvolvedores criem, implantem, testem e executem aplicativos de maneira rápida e confiável.</h4><h3>Mas enfim… o que é Docker?</h3><p>O Docker é uma plataforma de software projetada para permitir que os desenvolvedores empacotem seu código em contêineres, o que significa que eles podem empacotar tudo o que é necessário para executar o aplicativo em um único pacote. Isso inclui o código, dependências, bibliotecas, configurações e outros recursos. Esse pacote pode então ser facilmente implantado em qualquer ambiente, seja local ou na nuvem.</p><h3>Por que usar o Docker?</h3><p>Entre os diversos benefícios, um dos principais é o auxilio na redução dos problemas de compatibilidade em diferentes ambientes, seja em desenvolvimento ou em produção.</p><p>Além disso, os contêineres Docker são muito mais leves que as máquinas virtuais, o que significa que você pode executar mais contêineres com maior eficiência e economia de recursos.</p><h3>Como o Docker funciona?</h3><p>O Docker usa os recursos de gerenciamento de contêineres do sistema operacional para criar um ambiente de execução para os contêineres. Ele também cria um sistema de arquivos compartilhado para acessar os arquivos necessários para executar aplicativos. O Docker também fornece um conjunto de ferramentas para facilitar a implantação, gerenciamento e atualização dos contêineres.</p><h3>Rodando uma aplicação Ruby on Rails</h3><p>Para executaramos, por exemplo, uma aplicação Ruby on Rails podemos utilizar uma imagem base em um Dockerfile, como a do exemplo a seguir:</p><pre>FROM ruby:3.1.0<br><br>RUN apt-get update -qq &amp;&amp; apt-get install -y nodejs postgresql-client<br>RUN mkdir /myapp<br><br>WORKDIR /myapp<br><br>COPY Gemfile /myapp/Gemfile<br>COPY Gemfile.lock /myapp/Gemfile.lock<br><br>RUN bundle install<br><br>COPY . /myapp<br><br>CMD [&quot;rails&quot;, &quot;server&quot;, &quot;-b&quot;, &quot;0.0.0.0&quot;]</pre><p>E para executar nossa aplicação dentro deste contêiner, basta executarmos o seguinte comando:</p><pre>docker run -p 3000:3000</pre><p>Por ser uma plataforma de software versátil que permite que os desenvolvedores criem e implantem aplicativos de maneira rápida e confiável, ele reduz os problemas de compatibilidade e oferece um método eficiente para executar aplicativos em servidores locais e na nuvem. Além disso, o Docker permite que os desenvolvedores gerenciem facilmente seus contêineres com ferramentas simples e intuitivas.</p><p><strong>Gostou do conteúdo?</strong></p><p>Se você gostou deste texto, clique no link abaixo e receba uma notificação sempre que eu publicar um novo texto por aqui!</p><p><a href="https://jmscarpa.medium.com/subscribe">Get an email whenever João Mateus Scarpa publishes.</a></p><p>E se quiser falar comigo, só enviar um e-mail para <strong>joao.scarpa@gmail.com</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ec781baf20cc" width="1" height="1" alt=""><hr><p><a href="https://medium.com/designa-blog/introdu%C3%A7%C3%A3o-ao-docker-ec781baf20cc">Introdução ao Docker</a> was originally published in <a href="https://medium.com/designa-blog">Designa Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Aprendendo Ruby on Rails #1]]></title>
            <link>https://medium.com/designa-blog/aprendendo-ruby-on-rails-1-96198883973c?source=rss----1ed512f0c98f---4</link>
            <guid isPermaLink="false">https://medium.com/p/96198883973c</guid>
            <category><![CDATA[desenvolvimento]]></category>
            <category><![CDATA[ruby-on-rails]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[programação]]></category>
            <dc:creator><![CDATA[João Mateus Scarpa]]></dc:creator>
            <pubDate>Tue, 18 Oct 2022 02:33:04 GMT</pubDate>
            <atom:updated>2022-10-18T02:33:04.769Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Edi2G15N3wDn_6-x" /><figcaption>Photo by <a href="https://unsplash.com/@jplenio?utm_source=medium&amp;utm_medium=referral">Johannes Plenio</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>Aprendendo Ruby on Rails #1: O que você deveria saber antes de começar</h3><blockquote><em>“Learn just what you need to get started, then keep leveling up as you go.”</em></blockquote><p>“Aprenda apenas o que precisa para começar e depois continue evoluindo à medida que avança”. Este é um dos mantras e um dos grandes diferencias do (meta-)framework Ruby on Rails.</p><p>Exibido a primeira vez em 2003 por seu criado <a href="https://medium.com/u/54bcbf647830">DHH</a>, o Ruby on Rails é um framework de desenvolvimento web que usa a linguagem Ruby em sua base, ampliando e seguindo as diretrizes da linguagem, sendo focado no desenvolvedor e na facilidade e prazer em codificar.</p><p>Muitas vezes chamados simplesmente de <strong>Rails, </strong>ele é, tecnicamente, um meta-framework, ou seja, um framework formado por outros frameworks, onde podemos destacar algumas peças importantes como ActiveRecord, ActionController, ActionMailer, ActionPack, ActionSupport, etc…</p><p>O framework, que trabalha com a arquitetura MVC, pode ser utilizado desde a criação de API’s até a criação FullStack (com HTML, CSS e Javascript sendo renderizados pelo servidor). As duas abordagens compartilham praticamente 80% de código em comum, variando apenas com relação aos arquivos de <em>view. </em>Durante esta série abordaremos exclusivamente a utilização do Rails para a criação de API’s</p><p><strong>Convention over configuration &amp; DRY</strong></p><p>Sem dúvidas as duas principais características desta caixa de ferramentas que é o Ruby on Rails, e que estão intrinsecamente ligadas é o conceito e convenção sobre configuração (do inglês, CoC) e o de Não se Repita (do inglês, DRY).</p><p>Enquanto o conceito DRY diz a respeito a redução de repetição pela utilização de abstrações, o principio de convenção sobre a configuração nos ensina a utilizar as convenções pré-definidas a fim de reduzir a quantidade de código escrita, priorizando as regras já definidas pelo framework. Por exemplo, ao definir uma tabela <em>users </em>com os campos <em>id, name e mail, </em>o model vinculado a essa tabela não terá a necessidade de definir <em>getters</em> e <em>setters</em> para os 3 campos, pois já foram definidos e não precisamos repetir (DRY). Ainda no mesmo exemplo, esperamos que a tabela <em>users </em>seja representada pelo modelo <em>User </em>(o mesmo nome da tabela, no singular) pois esta é a convenção pré-estabelecida pelo framework. (CoC). É importante dizer que essa convenção pode ser sobrescrita, pois aqui o intuito maior não é limitar o usuário e sim facilitar o dia a dia de quem puder e escolher seguir as convenções.<br>(<em>Afinal… escrevendo menos código temos menos chance de criarmos bugs 😉)</em></p><p>Por mais que eu tente me manter neutro com relação a tecnologias e linguagens na maior parte do tempo, não tem como negar o meu apego profissional e emocional com Ruby e com Ruby on Rails.</p><p>Mesmo estudando e trabalhando com programação há quase 15 anos, eu marco o início oficial da minha carreira na área de software (seja como programador, tech lead, consultor ou educador) quando conheci e comecei a me dedicar a essa linguagem e framework.</p><p>Poder trabalhar ensinando essa e outras ferramentas que foram importantes para minha carreira e plantar essa mesma semente que foi plantada em mim há 10 anos atrás é um prazer sem igual.</p><p><strong>Gostou do conteúdo?</strong></p><p>Se você gostou deste texto, clique no link abaixo e receba uma notificação sempre que eu publicar um novo texto por aqui!</p><p><a href="https://jmscarpa.medium.com/subscribe">Get an email whenever João Mateus Scarpa publishes.</a></p><p>E se quiser falar comigo, só enviar um e-mail para <strong>joao.scarpa@gmail.com</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=96198883973c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/designa-blog/aprendendo-ruby-on-rails-1-96198883973c">Aprendendo Ruby on Rails #1</a> was originally published in <a href="https://medium.com/designa-blog">Designa Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Aprendendo Angular #12: Construindo uma aplicação single-page]]></title>
            <link>https://medium.com/designa-blog/aprendendo-angular-12-construindo-uma-aplica%C3%A7%C3%A3o-single-page-cb312d1c29e?source=rss----1ed512f0c98f---4</link>
            <guid isPermaLink="false">https://medium.com/p/cb312d1c29e</guid>
            <category><![CDATA[angular]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[João Mateus Scarpa]]></dc:creator>
            <pubDate>Tue, 04 Oct 2022 02:17:43 GMT</pubDate>
            <atom:updated>2022-10-04T02:17:43.490Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*_76s0ZkYhLGaxYmM" /><figcaption>Photo by <a href="https://unsplash.com/@alan_rodriguez?utm_source=medium&amp;utm_medium=referral">Alan Rodriguez</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Depois de toda a teoria e conceitos chegou a hora de juntarmos tudo que vimos até aqui e construir nossa primeira aplicação. Para começarmos de forma simples, vamos construir uma aplicação de “To-do List”, onde o usuário poderá listar, adicionar e remover tarefas da sua lista. Bora lá!</p><h4>Setup</h4><p>Vamos começar a nossa aplicação com base no template disponível <a href="https://github.com/designa-learning/app-web">neste repositório</a>. Aqui já temos uma aplicação com Angular e a estrutura necessária para executá-la em um container docker.</p><p>Nossa primeira modificação no projeto será colocar as dependências que iremos utilizar no arquivo app.module.ts. Adicionaremos 3 módulos: os dois de formulário e o cliente de Http.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oD08agplbv4rgtwtLspJmw.png" /><figcaption>Importamos as dependências e as injetamos no vetor de Imports</figcaption></figure><h4>Criando nossa página</h4><p>Como nossa aplicação será bem simples, ela terá apenas uma página que será representada pelo <strong><em>TasksComponent </em></strong>que criaremos no diretório app/pages/tasks com o seguinte conteúdo inicial:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1006/1*KBUawLh9WMhYqKyHacIfAQ.png" /><figcaption>app/pages/tasks/tasks.component.ts</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/660/1*nIGNpNkczONSoMV8nsaAHA.png" /><figcaption>app/pages/tasks/tasks.component.html</figcaption></figure><p>Agora para tornar nosso componente utilizável e o transformarmos de fato em uma página, precisamos declará-lo no <strong><em>app.module.ts</em></strong> e criar uma rota para o mesmo no arquivo <strong><em>app-routing.module.ts</em></strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*crPOcGdVTxDS1iqyetup5A.png" /><figcaption>Atualizamos nosso app.module.ts com o nosso componente no vetor declarations</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YJRcU1WeQPjpdUTGSWrB8w.png" /><figcaption>app-routing.module.ts: Importamos o componente e declaramos uma rota para o mesmo.</figcaption></figure><p>Após esses passos, já conseguimos visualizar nossa página no navegador:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LsswHvMght-qZZO7VtNWMA.png" /><figcaption>Nossa aplicação rodando com o nosso componente sendo exibido como pagina.</figcaption></figure><h4>Trabalhando o visual</h4><p>Para nos auxiliar na questão visual da nossa página, iremos utilizar o <a href="https://getbootstrap.com/">Bootstrap</a> através de um <a href="https://www.bootstrapcdn.com/">CDN </a>para facilitar a instalação. Para isso adicionaremos a seguinte importação no arquivo index.html</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ly466GfrEMREFC_V_Nfimw.png" /><figcaption>Realizamos a importação do bootstrap com a tag link da linha 10 e 11</figcaption></figure><p>Após importar o Bootstrap e adicionar alguns elementos HTML e classes no nosso componente, montamos a seguinte tela:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_4VSYNu-Rxn-Rx7KNGWTGg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6X54gDsRZifkvIAzFMLyxA.png" /></figure><h4>Buscando informações</h4><p>Com nossa tela pronta, agora é hora de buscarmos as informações em nossa API e exibi-las na tela.</p><p>Nosso primeiro passo será importar e inicializar o nosso HTTP Client em uma variável através do método construtor do componente.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WpYe1EHGd0FNEJrFkO7R4w.png" /></figure><p>Com o HTTP Client disponível na variável httpClient, vamos implementar a interface OnInit em nosso componente e criar uma variável para armazenar os itens da nossa lista:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ae5lkK8u6YFGllrKYBc9ig.png" /></figure><p>Notem que para definirmos o tipo da nossa variável tasks (linha 17) criamos uma interface com nome Task (linha 4) com os campos id, title e done.</p><p>Agora podemos, enfim, consultar a nossa API para buscar as informações.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IPUDd9vmdk7C-TVafNpKTQ.png" /><figcaption>Estamos utilizando a API no endereço http://localhost:3000</figcaption></figure><p>Por fim, podemos utilizar a variável <em>tasks</em> para renderizar os itens na nossa lista no nosso HTML.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Tqys8OnCn0d99j6p6M6ZuQ.png" /><figcaption>Altermos nossa lista no arquivo html para realizar o *ngFor acima</figcaption></figure><h4>Gravando informações</h4><p>Com nossa lista funcionando, chegou a hora de gravar os itens na nossa API, para fazer isso vincularemo o input da tela com um ngModel e ao clicarmos no botão <strong><em>Add </em></strong>iremos enviar uma requisição para API para criar uma nova tarefa.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f4sZyr_Y10Dj_3IFd4eFoA.png" /><figcaption>Na nossa tag input, utilizaremos a diretiva [(ngModel)] e a vincularemos com a variável newTask que criaremos no nosso arquivo ts</figcaption></figure><p>De forma similar, iremos utilizar a diretiva <em>(click)</em> em nosso botão para chamar uma função do nosso componente chamada <em>save()</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vTG1j2MZogTCtLMx_i2Gng.png" /></figure><p>Agora, vamos dar uma olhada na estrutura do nosso arquivo Typescript com a variável e a função save.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bDw_IKmVmU1VGOfoN9o6mQ.png" /><figcaption>Além da função save, refatoramos a função ngOnInit e criamos a função loadTasks</figcaption></figure><p>Note que na função <strong><em>save</em></strong>, não passamos tipo para o método post do HTTP Client pois esta chamada para API não possuí um retorno, logo, não precisamos atribuir um tipo para ela.</p><p>Outro ponto de atenção é nas ações realizadas após o envio das informações para a API: Resetamos o valor da variável newTask e chamamos a função loadTasks para recarregar a lista de tarefas na tela.</p><h4>Excluindo tarefas</h4><p>Para realizarmos a exclusão de tarefas da lista, vamos alterar nosso HTML e inserir um botão de excluir para cada tarefa da nossa lista.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*U9PuosWRg247KYHMwb1uQA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YHp-DMV8oWZL7Qy4pJQ-_Q.png" /><figcaption>No nosso HTML, adicionamos o botão com uma chamada para a função <em>deleteTask </em>com o id da tarefa selecionada como parâmetro.</figcaption></figure><p>No nosso TS, criaremos a função <strong><em>deleteTask</em></strong> da seguinte forma:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*m7-VccBeKTJXwLbquz3fMA.png" /><figcaption>A função receberá o id da tarefa que será apagada e realizaremos uma chamada para a API com o método delete e após sua execução chamaremos a função loadTasks para recarregar a lista de tarefas.</figcaption></figure><h4>Atualizando a tarefa</h4><p>Avançando em nossa aplicação, chegou a hora de conseguirmos marcar as atividades como feitas ou não feitas e essas modificações serão atualizadas em nossa API e nossa tela irá reagir a essas mudanças.</p><p>Vamos começar com as mudanças em nossa tela: toda vez que uma tarefa estiver marcada como finalizada iremos exibi-la com outra cor e tachada.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lfzEbshJY0BiiYTM03oSpg.png" /><figcaption>Este será o visual da nossa lista</figcaption></figure><p>Vamos dar uma olhada em como ficou nosso HTML para criar esse efeito</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0j4N3_NPlezQabnIgf-hSQ.png" /></figure><p>Aqui no HTML temos alguns pontos interessantes:</p><ul><li>Linha 11: Utilizamos a diretiva <strong><em>[checked] </em></strong>para marcar o checkbox caso a propriedade <em>done </em>da tarefa tenha o valor verdadeiro.</li><li>Linha 11: utilizamos a diretiva <strong><em>(change) </em></strong>para chamar a função toggleTask toda vez que o input tiver seu valor alterado. Essa função receberá a própria tarefa como parâmetro.</li><li>Linha 12: Utilizamos a diretiva <strong><em>[class.]</em></strong> para aplicar a classe <strong><em>done </em></strong>ao label caso a propriedade <strong><em>done</em></strong> da tarefa tiver um valor verdadeiro.</li></ul><p>No nosso arquivo TS temos a adição da função toggleTask com o seguinte conteúdo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3VyZnQuZYjgY2fhjt-oQTA.png" /></figure><p>A função <strong><em>toggleTask </em></strong>receberá uma tarefa como parâmetro, irá inverter o valor da propriedade <strong><em>done </em></strong>da tarefa e então realizará uma chamada para a API com o método <strong><em>patch</em></strong> passando no payload a chave <em>done </em>e o seu novo valor. Aqui como não nos importar o retorno da API não utilizaremos a construção com o <strong><em>then </em></strong>encerrando nossa chamada no método <strong>toPromisse().</strong></p><h4>Aplicação funcionando</h4><p>Por fim, podemos ter uma visão da nossa aplicação funcionando no vídeo abaixo:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FEFfMbJM0eJc%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DEFfMbJM0eJc&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/c51a449d5d29c8d250140905531011ce/href">https://medium.com/media/c51a449d5d29c8d250140905531011ce/href</a></iframe><p><strong>Gostou do conteúdo?</strong></p><p>Se você gostou deste texto, clique no link abaixo e receba uma notificação sempre que eu publicar um novo texto por aqui!</p><p><a href="https://jmscarpa.medium.com/subscribe">Get an email whenever João Mateus Scarpa publishes.</a></p><p>E se quiser falar comigo, só enviar um e-mail para <strong>joao.scarpa@gmail.com</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cb312d1c29e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/designa-blog/aprendendo-angular-12-construindo-uma-aplica%C3%A7%C3%A3o-single-page-cb312d1c29e">Aprendendo Angular #12: Construindo uma aplicação single-page</a> was originally published in <a href="https://medium.com/designa-blog">Designa Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Aprendendo Angular #11: Primeira requisição para API]]></title>
            <link>https://medium.com/designa-blog/aprendendo-angular-11-primeira-requisi%C3%A7%C3%A3o-para-api-cf659714e29?source=rss----1ed512f0c98f---4</link>
            <guid isPermaLink="false">https://medium.com/p/cf659714e29</guid>
            <category><![CDATA[angular]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[João Mateus Scarpa]]></dc:creator>
            <pubDate>Mon, 03 Oct 2022 23:19:57 GMT</pubDate>
            <atom:updated>2022-10-03T23:19:57.524Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*NE-QWHCYhaM_3Izo" /><figcaption>Photo by <a href="https://unsplash.com/@freeche?utm_source=medium&amp;utm_medium=referral">Kvistholt Photography</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Da mesma que precisamos importar alguns módulos para <a href="https://blog.designa.com.br/aprendendo-angular-10-formul%C3%A1rios-c6e8be2688d5">trabalhar com formulários</a>, para realizarmos chamadas para uma API, também precisaremos importar alguns módulos específicos para nossa a aplicação. Mas antes de partirmos para o código, desta vez, precisamos de um pouco de teoria.</p><h4>Verbos HTTP</h4><p>Quando trafegamos informações entre nossas aplicações Front-End (Cliente) e Back-end (Servidor) através do protocolo HTTP, essas requisições sempre serão precedidas por um <strong>verbo HTTP</strong>, que indicará para o servidor a intenção daquela requisição a deixando mais explicita e semântica. Os principais verbos HTTP com suas respectivas funções são:</p><ul><li><strong>GET: </strong>Utilizado para obter informações do servidor, geralmente não utiliza parâmetros, mas pode recebê-los via query string.</li><li><strong>POST: </strong>Utilizado quando queremos criar algum recurso no servidor (ex: realizar um cadastro de informação). Geralmente vai receber um conjunto de dados no corpo da requisição, ao qual damos o nome de <em>payload</em>.</li><li><strong>PATCH: </strong>Tem o funcionamento muito parecido com o do POST, porém é utilizado com o intuito de atualizar uma informação já existente no servidor. Geralmente também receberá informações no corpo da requisição.</li><li><strong>DELETE: </strong>Por fim, como o nome sugere, a utilização do verbo DELETE, é feita quando desejamos realizar a exclusão de um recurso do servidor. Também pode receber informações no corpo da requisição mas é menos comum.</li></ul><h4>Códigos de status</h4><p>Uma outra parte muito importante das requisições web é a identificação das suas respostas e isso se dá através dos códigos de status. Para cada tipo de resposta, teremos um código específico (ou quase isso), sendo os mais conhecidos e mais utilizados os seguintes:</p><ul><li><strong>Códigos da linha 200: </strong>Indicam sucesso na requisição, os mais utilizados são os 200 (ok) e o 201 (recurso criado)</li><li><strong>Os códigos da linha 400: </strong>Esses códigos indicam que algo aconteceu de inesperado na requisição e ela não pode ser finalizada com sucesso. Os mais utilizados são: 400 (Má requisição), 401 (Não autorizado), 403 (Acesso restrito), 404 (Recurso não encontrado) e 422 (Entidade não processada)</li><li><strong>Os códigos da linha 500:</strong> São erros que acontecem no servidor e geralmente indicam algum problema no código ou infraestrutura do mesmo. Os mais utilizados são 500 (erro interno), 503 (Serviço indisponível) e 504 (Timeout)</li></ul><p>Com essa parte da teoria explicada, vamos colocar a mão no código! O módulo que utilizaremos para fazer as chamadas HTTP será o HttpClientModule, do pacote @angular/core/http, da seguinte maneira:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YbVJKcVikfmUuCoAUGNKUA.png" /><figcaption>Importamos o pacote e o adicionamos nos imports</figcaption></figure><p>Um exemplo de componente realizando uma chamada para api, ficaria da seguinte maneira:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gcq_bBb6x1gCPE2K4_QN4g.png" /></figure><p>Sobre esta sintaxe é importante repararmos nos seguintes pontos:</p><ul><li>O HttpClient deve ser inicializado no método construtor do componente;</li><li>Em sua utilização escolhemos o verbo/método (no caso acima foi o <em>get</em>) e devemos definir o tipo do retorno entre &lt; &gt;. Este tipo será atribuído para a variável data, no retorno da <em>promise</em>;</li><li>O método chamado no <em>httpClient </em>(<em>get, post, delete, patch</em>) retornará um <em>Observable</em>, que iremos transformar para uma <em>promise </em>e então acessaremos o seu valor com as instruções <em>then </em>e/ou <em>catch</em></li><li>Os métodos get, post, patch e delete no httpClient recebem obrigatoriamente uma URL como primeiro parâmetro e podem receber um objeto como segundo parâmetro: No <em>get</em> este objeto será transformado em queryString e nos demais métodos serão considerados <em>payload </em>da requisição.</li></ul><p><strong>Gostou do conteúdo?</strong></p><p>No próximo artigo, vamos utilizar tudo que vimos até aqui para construir uma aplicação de uma página.</p><p>Se você gostou deste texto, clique no link abaixo e receba uma notificação sempre que eu publicar um novo texto por aqui!</p><p><a href="https://jmscarpa.medium.com/subscribe">Get an email whenever João Mateus Scarpa publishes.</a></p><p>E se quiser falar comigo, só enviar um e-mail para <strong>joao.scarpa@gmail.com</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cf659714e29" width="1" height="1" alt=""><hr><p><a href="https://medium.com/designa-blog/aprendendo-angular-11-primeira-requisi%C3%A7%C3%A3o-para-api-cf659714e29">Aprendendo Angular #11: Primeira requisição para API</a> was originally published in <a href="https://medium.com/designa-blog">Designa Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Aprendendo Angular #10: Formulários]]></title>
            <link>https://medium.com/designa-blog/aprendendo-angular-10-formul%C3%A1rios-c6e8be2688d5?source=rss----1ed512f0c98f---4</link>
            <guid isPermaLink="false">https://medium.com/p/c6e8be2688d5</guid>
            <category><![CDATA[development]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[angular]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[João Mateus Scarpa]]></dc:creator>
            <pubDate>Mon, 03 Oct 2022 16:41:45 GMT</pubDate>
            <atom:updated>2022-10-03T23:21:18.853Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*66dYs4ItrIHSc5i5" /><figcaption>Photo by <a href="https://unsplash.com/@homajob?utm_source=medium&amp;utm_medium=referral">Scott Graham</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Para interagir de forma mais dinâmica com o usuário, nossa aplicação precisa ser capaz de receber informações do usuário para processarmos e a forma mais fácil de fazermos isso em uma aplicação web é através da entrada de informações por formulários.</p><p>Em Angular temos duas principais formas de interagir com os formulários e acessarmos os valores digitados pelo usuário: através da diretiva ngModel ou pela construção de um FormGroup e FormControl.</p><p>Independente de qual caminho vamos seguir, precisaremos importar dois módulos do pacote @<strong>angular/forms</strong> em nosso <strong>app.module.ts</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Qg1CtL5NP8JLtYYxK6Lw9A.png" /><figcaption>Realizamos a importação dos módulos <strong>FormsModule </strong>e <strong>ReactiveFormsModule</strong></figcaption></figure><h4><strong>ngModel</strong></h4><p>Quando a nossa entrada de informações não está vinculada a um formulário podemos usar a diretiva ngModel para facilitar o acesso a informação inserida pelo usuário. Essa diretiva irá conectar o componente de entrada (input, select, textarea, etc..) diretamente com uma variável pública daquele componente. A diretiva, por ser um vinculo de mão dupla (<em>two-way data binding</em>) será utilizado com a notação denominada <em>banana box </em>como demonstada abaixo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XH1q53D9AIttUfKYyeud-w.png" /><figcaption>O valor entrado no input será enviado para a variável pública name, definida no arquivo ts do componente</figcaption></figure><h4><strong>FormGroup e FormControl</strong></h4><p>Uma forma mais robusta de acessarmos e manipularmos os dados inseridos pelo usuários é através da utilização de FormGroups e FormControls. Essas duas estruturas serão utilizadas em conjunto. Enquanto o FormGroup representa o formulário como um todo, o FormControl representará um campo de entrada de do usuário.</p><p>Sua utilzação será feita tanto no arquivo de typescript quanto no arquivo de HTML da seguinte forma:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GV5dGCZfLVq924PTDbOROg.png" /><figcaption><strong>No Typescript: </strong>Criamos um variável pública do tipo FormGroup e a inicializamos com um objeto de vários FormControls.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*THCOKFU8kKM4i7GCEFRRag.png" /><figcaption><strong>No HTML:</strong> Utilizamos a diretiva [formGroup] no formulário para vincularmos com a variável do FormGroup e diretiva formControlName para vincular os elementos de entrada com os FormControls do Form.</figcaption></figure><p>Apesar da construção ser mais verbosa, ela nos trás alguns benefícios como a possibilidade de validação dos campos e do formulário, a entrada de valores padrão de forma mais simples e a capacidade de agrupamento das informações de forma “automática”.</p><p>Vejamos alguns exemplos da utilização dessa funcionalidades do formulário.</p><h4>Validações</h4><p>Sempre que definirmos um novo FormControl, podemos passar duas informações para seu construtor: o valor inicial e um vetor com validações para aquele campo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JDLUpdL-U1vJgH3LPK3bAA.png" /></figure><p>Desta forma, através do objeto form podemos utilizar o método valid para saber se todos os campos estão de acordo com as validações antes de utilizarmos de fato os valores:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/814/1*ArEFnuDANlGbYeJH6iiJuA.png" /></figure><h4>Acessando os valores</h4><p>Para acessar os valores do formulário, também podemos fazer de forma simples, através da propriedade <strong><em>value </em></strong>objeto <strong><em>form</em></strong>, da seguinte forma:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/814/1*Rc7d2XCaeSViS4MxuYDijg.png" /><figcaption>Refatoramos a função save apresentada anteriormente para exibir os valores do formulário no console do navegador caso todos os campos estejam de acordo com a validação.</figcaption></figure><p><strong>Gostou do conteúdo?</strong></p><p>No próximo artigo, vamos finalmente aprender a interagir com com uma API e obter informações diretamente do nosso servidor.</p><p><a href="https://blog.designa.com.br/aprendendo-angular-11-primeira-requisi%C3%A7%C3%A3o-para-api-cf659714e29">Aprendendo Angular #11: Primeira requisição para API</a></p><p>Se você gostou deste texto, clique no link abaixo e receba uma notificação sempre que eu publicar um novo texto por aqui!</p><p><a href="https://jmscarpa.medium.com/subscribe">Get an email whenever João Mateus Scarpa publishes.</a></p><p>E se quiser falar comigo, só enviar um e-mail para <strong>joao.scarpa@gmail.com</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c6e8be2688d5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/designa-blog/aprendendo-angular-10-formul%C3%A1rios-c6e8be2688d5">Aprendendo Angular #10: Formulários</a> was originally published in <a href="https://medium.com/designa-blog">Designa Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Aprendendo Angular #09: Separando nossas regras com Services]]></title>
            <link>https://medium.com/designa-blog/aprendendo-angular-09-separando-nossas-regras-com-services-b9b435f99a2b?source=rss----1ed512f0c98f---4</link>
            <guid isPermaLink="false">https://medium.com/p/b9b435f99a2b</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[angular]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[João Mateus Scarpa]]></dc:creator>
            <pubDate>Fri, 30 Sep 2022 02:36:29 GMT</pubDate>
            <atom:updated>2022-10-03T23:20:48.174Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ZctBjiWvKSf_uNZD" /><figcaption>Photo by <a href="https://unsplash.com/@cytonn_photography?utm_source=medium&amp;utm_medium=referral">Cytonn Photography</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Muitas vezes em nossas aplicações temos a necessidade de compartilhar informações através de muitos componentes e a melhor forma de fazermos isso em nossas aplicações é através de uma estrutura nomeada <strong>Service. </strong>Além de fornecer acesso à essas informações ela auxiliar a organizarmos nosso código e permitir que nossos componentes fiquem responsáveis apenas pela apresentação dos dados.</p><h4>Criando nosso primeiro service</h4><p>Seguindo a organização da nossa aplicação, iremos criar um diretório <strong>services</strong>, dentro do diretório app e inicializar um arquivo nomeado <strong>auth.service.ts </strong>com o seguinte conteúdo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Vchdz6xe0v6oCt2-ndsuUQ.png" /><figcaption>Nosso serviço é uma classe decorada com o marcador Injectable, do pacote @angular/core.</figcaption></figure><p>Quando decoramos nossas classe com o marcador Injectable deixamos essas classe pronta para o sistema de injeção de dependências do Angular, o que nos permitirá a utilizá-la através dos construtores dos nossos componentes, da seguinte forma:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_fQZVwpI0xZe_IGg1hCstA.png" /><figcaption>Ao utilizarmos a inicialização dentro do método constructor já podemos utilizar todos seus métodos e variáveis</figcaption></figure><h4>Compondo nosso service</h4><p>Para centralizarmos as rotinas e as informações com relação a autenticação do usuário, iremos utilizar o <a href="https://blog.designa.com.br/aprendendo-angular-08-guardando-nossas-p%C3%A1ginas-6de017bb7349">localStorage</a> e compor nosso service com as seguintes funções:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Vln2NSp5uNtmMjT52g83zA.png" /></figure><p><strong>Gostou do conteúdo?</strong></p><p>No próximo artigo, vamos aprender a manipular formulários e receber a entrada de informações do usuário.</p><p><a href="https://blog.designa.com.br/aprendendo-angular-10-formul%C3%A1rios-c6e8be2688d5">Aprendendo Angular #10: Formulários</a></p><p>Se você gostou deste texto, clique no link abaixo e receba uma notificação sempre que eu publicar um novo texto por aqui!</p><p><a href="https://jmscarpa.medium.com/subscribe">Get an email whenever João Mateus Scarpa publishes.</a></p><p>E se quiser falar comigo, só enviar um e-mail para <strong>joao.scarpa@gmail.com</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b9b435f99a2b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/designa-blog/aprendendo-angular-09-separando-nossas-regras-com-services-b9b435f99a2b">Aprendendo Angular #09: Separando nossas regras com Services</a> was originally published in <a href="https://medium.com/designa-blog">Designa Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>