├── .gitignore ├── Dockerfile ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── _config.yml ├── _includes ├── footer.html ├── github-corner.html ├── header.html └── other-guides.md ├── _layouts └── default.html ├── _posts ├── 2012-04-18-app.markdown ├── 2012-04-18-guide.markdown ├── 2012-04-19-contributing.markdown ├── 2012-04-19-heroku.markdown ├── 2012-04-30-commenting.markdown ├── 2012-06-03-thumbnails.markdown ├── 2012-11-01-devise.markdown ├── 2013-01-20-design.markdown ├── 2013-03-26-coach.markdown ├── 2013-04-08-how-to-continue-with-programming.markdown ├── 2013-04-14-github.md ├── 2013-05-02-install.markdown ├── 2013-05-10-EYDeploy.markdown ├── 2013-07-23-bundlerfordevelopment.markdown ├── 2013-07-25-videos.markdown ├── 2013-08-12-guide-to-the-guide.markdown ├── 2013-10-16-remote-pairing-for-the-win.markdown ├── 2013-11-12-openshift.markdown ├── 2013-12-18-add-gravatar.markdown ├── 2014-01-05-design-using-html-and-css-chinese.markdown ├── 2014-01-05-design-using-html-and-css.markdown ├── 2014-01-30-anynines.markdown ├── 2014-01-30-continuous-codeship.markdown ├── 2014-01-30-continuous-travis.markdown ├── 2014-01-30-ruby-game.markdown ├── 2014-01-30-testing.markdown ├── 2014-01-30-trucker.markdown ├── 2014-02-13-simple-app.markdown ├── 2014-03-24-alternative-dev-environment.markdown ├── 2014-05-09-test-driven-development.markdown ├── 2014-05-10-ruby-atm.markdown ├── 2014-05-10-sinatra-html.markdown ├── 2014-05-10-sinatra.markdown ├── 2014-05-29-touristic-autism_basic-app.markdown ├── 2014-05-29-touristic-autism_continuous-deployment.markdown ├── 2014-05-29-touristic-autism_design.markdown ├── 2014-05-29-touristic-autism_git.markdown ├── 2014-05-29-touristic-autism_google-map.markdown ├── 2014-05-29-touristic-autism_image-upload.markdown ├── 2014-05-29-touristic-autism_intro.markdown ├── 2014-05-29-touristic-autism_resource-modeling.markdown ├── 2014-05-29-touristic-autism_resource-rating.markdown ├── 2014-05-29-touristic-autism_static-pages-tdd.markdown ├── 2014-10-02-sinatra-app-tutorial.markdown ├── 2014-10-05-diary-app.markdown ├── 2015-08-16-sinatra-app-tutorial-in-bulgarian.markdown ├── 2015-09-11-continuous-snap-ci.markdown ├── 2016-08-12-twitter-widget.markdown ├── 2016-08-30-activeadmin.markdown ├── 2017-08-13-shoulda-matchers.markdown ├── 2018-02-01-passenger.markdown └── 2021-04-05-docker.markdown ├── css ├── bootstrap-responsive.css ├── bootstrap.css ├── code.css └── style.css ├── favicon.png ├── images ├── 1.png ├── 2.png ├── 3.png ├── butterfly_login.png ├── chrome-confirm-resubmission.png ├── chrome-post-redirect.png ├── cloneordownload.png ├── codenvy │ ├── create-account.jpg │ ├── create-workspace-dashboard.jpg │ ├── create-workspace.jpg │ ├── get-workspace-ip.jpg │ └── start-workspace.jpg ├── coffee-app.png ├── complete.png ├── fork1.jpg ├── guides-hero.png ├── icon-app.png ├── icon-browser.png ├── icon-prompt.png ├── icon-small-browser.png ├── icon-small-prompt.png ├── icon-small-text-editor.png ├── icon-text-editor.png ├── pull_request.png ├── railsgirls-guides-portugues.png ├── railsgirls-guides.png ├── star.png ├── url-breakdown.png └── virtualbox.png ├── index.html └── js ├── guides.js ├── jquery.cookie.js ├── mobile-menu.js └── prefixfree.min.js /.gitignore: -------------------------------------------------------------------------------- 1 | .bundle/ 2 | _site/ 3 | .DS_Store 4 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ruby:3.2.2-alpine3.17 2 | 3 | ENV BUNDLER_VERSION=2.1.4 4 | 5 | COPY . /app 6 | WORKDIR /app 7 | 8 | RUN apk update && apk add --virtual build-dependencies build-base 9 | RUN bundle install 10 | 11 | EXPOSE 4000 12 | 13 | CMD bundle exec jekyll serve --watch --host 0.0.0.0 -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'github-pages' 4 | gem "jekyll" 5 | gem "jekyll-redirect-from" 6 | gem "webrick" -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | activesupport (7.0.4.3) 5 | concurrent-ruby (~> 1.0, >= 1.0.2) 6 | i18n (>= 1.6, < 2) 7 | minitest (>= 5.1) 8 | tzinfo (~> 2.0) 9 | addressable (2.8.4) 10 | public_suffix (>= 2.0.2, < 6.0) 11 | coffee-script (2.4.1) 12 | coffee-script-source 13 | execjs 14 | coffee-script-source (1.11.1) 15 | colorator (1.1.0) 16 | commonmarker (0.23.9) 17 | concurrent-ruby (1.2.2) 18 | dnsruby (1.70.0) 19 | simpleidn (~> 0.2.1) 20 | em-websocket (0.5.3) 21 | eventmachine (>= 0.12.9) 22 | http_parser.rb (~> 0) 23 | ethon (0.16.0) 24 | ffi (>= 1.15.0) 25 | eventmachine (1.2.7) 26 | execjs (2.8.1) 27 | faraday (2.7.4) 28 | faraday-net_http (>= 2.0, < 3.1) 29 | ruby2_keywords (>= 0.0.4) 30 | faraday-net_http (3.0.2) 31 | ffi (1.15.5) 32 | forwardable-extended (2.6.0) 33 | gemoji (3.0.1) 34 | github-pages (228) 35 | github-pages-health-check (= 1.17.9) 36 | jekyll (= 3.9.3) 37 | jekyll-avatar (= 0.7.0) 38 | jekyll-coffeescript (= 1.1.1) 39 | jekyll-commonmark-ghpages (= 0.4.0) 40 | jekyll-default-layout (= 0.1.4) 41 | jekyll-feed (= 0.15.1) 42 | jekyll-gist (= 1.5.0) 43 | jekyll-github-metadata (= 2.13.0) 44 | jekyll-include-cache (= 0.2.1) 45 | jekyll-mentions (= 1.6.0) 46 | jekyll-optional-front-matter (= 0.3.2) 47 | jekyll-paginate (= 1.1.0) 48 | jekyll-readme-index (= 0.3.0) 49 | jekyll-redirect-from (= 0.16.0) 50 | jekyll-relative-links (= 0.6.1) 51 | jekyll-remote-theme (= 0.4.3) 52 | jekyll-sass-converter (= 1.5.2) 53 | jekyll-seo-tag (= 2.8.0) 54 | jekyll-sitemap (= 1.4.0) 55 | jekyll-swiss (= 1.0.0) 56 | jekyll-theme-architect (= 0.2.0) 57 | jekyll-theme-cayman (= 0.2.0) 58 | jekyll-theme-dinky (= 0.2.0) 59 | jekyll-theme-hacker (= 0.2.0) 60 | jekyll-theme-leap-day (= 0.2.0) 61 | jekyll-theme-merlot (= 0.2.0) 62 | jekyll-theme-midnight (= 0.2.0) 63 | jekyll-theme-minimal (= 0.2.0) 64 | jekyll-theme-modernist (= 0.2.0) 65 | jekyll-theme-primer (= 0.6.0) 66 | jekyll-theme-slate (= 0.2.0) 67 | jekyll-theme-tactile (= 0.2.0) 68 | jekyll-theme-time-machine (= 0.2.0) 69 | jekyll-titles-from-headings (= 0.5.3) 70 | jemoji (= 0.12.0) 71 | kramdown (= 2.3.2) 72 | kramdown-parser-gfm (= 1.1.0) 73 | liquid (= 4.0.4) 74 | mercenary (~> 0.3) 75 | minima (= 2.5.1) 76 | nokogiri (>= 1.13.6, < 2.0) 77 | rouge (= 3.26.0) 78 | terminal-table (~> 1.4) 79 | github-pages-health-check (1.17.9) 80 | addressable (~> 2.3) 81 | dnsruby (~> 1.60) 82 | octokit (~> 4.0) 83 | public_suffix (>= 3.0, < 5.0) 84 | typhoeus (~> 1.3) 85 | html-pipeline (2.14.3) 86 | activesupport (>= 2) 87 | nokogiri (>= 1.4) 88 | http_parser.rb (0.8.0) 89 | i18n (1.13.0) 90 | concurrent-ruby (~> 1.0) 91 | jekyll (3.9.3) 92 | addressable (~> 2.4) 93 | colorator (~> 1.0) 94 | em-websocket (~> 0.5) 95 | i18n (>= 0.7, < 2) 96 | jekyll-sass-converter (~> 1.0) 97 | jekyll-watch (~> 2.0) 98 | kramdown (>= 1.17, < 3) 99 | liquid (~> 4.0) 100 | mercenary (~> 0.3.3) 101 | pathutil (~> 0.9) 102 | rouge (>= 1.7, < 4) 103 | safe_yaml (~> 1.0) 104 | jekyll-avatar (0.7.0) 105 | jekyll (>= 3.0, < 5.0) 106 | jekyll-coffeescript (1.1.1) 107 | coffee-script (~> 2.2) 108 | coffee-script-source (~> 1.11.1) 109 | jekyll-commonmark (1.4.0) 110 | commonmarker (~> 0.22) 111 | jekyll-commonmark-ghpages (0.4.0) 112 | commonmarker (~> 0.23.7) 113 | jekyll (~> 3.9.0) 114 | jekyll-commonmark (~> 1.4.0) 115 | rouge (>= 2.0, < 5.0) 116 | jekyll-default-layout (0.1.4) 117 | jekyll (~> 3.0) 118 | jekyll-feed (0.15.1) 119 | jekyll (>= 3.7, < 5.0) 120 | jekyll-gist (1.5.0) 121 | octokit (~> 4.2) 122 | jekyll-github-metadata (2.13.0) 123 | jekyll (>= 3.4, < 5.0) 124 | octokit (~> 4.0, != 4.4.0) 125 | jekyll-include-cache (0.2.1) 126 | jekyll (>= 3.7, < 5.0) 127 | jekyll-mentions (1.6.0) 128 | html-pipeline (~> 2.3) 129 | jekyll (>= 3.7, < 5.0) 130 | jekyll-optional-front-matter (0.3.2) 131 | jekyll (>= 3.0, < 5.0) 132 | jekyll-paginate (1.1.0) 133 | jekyll-readme-index (0.3.0) 134 | jekyll (>= 3.0, < 5.0) 135 | jekyll-redirect-from (0.16.0) 136 | jekyll (>= 3.3, < 5.0) 137 | jekyll-relative-links (0.6.1) 138 | jekyll (>= 3.3, < 5.0) 139 | jekyll-remote-theme (0.4.3) 140 | addressable (~> 2.0) 141 | jekyll (>= 3.5, < 5.0) 142 | jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) 143 | rubyzip (>= 1.3.0, < 3.0) 144 | jekyll-sass-converter (1.5.2) 145 | sass (~> 3.4) 146 | jekyll-seo-tag (2.8.0) 147 | jekyll (>= 3.8, < 5.0) 148 | jekyll-sitemap (1.4.0) 149 | jekyll (>= 3.7, < 5.0) 150 | jekyll-swiss (1.0.0) 151 | jekyll-theme-architect (0.2.0) 152 | jekyll (> 3.5, < 5.0) 153 | jekyll-seo-tag (~> 2.0) 154 | jekyll-theme-cayman (0.2.0) 155 | jekyll (> 3.5, < 5.0) 156 | jekyll-seo-tag (~> 2.0) 157 | jekyll-theme-dinky (0.2.0) 158 | jekyll (> 3.5, < 5.0) 159 | jekyll-seo-tag (~> 2.0) 160 | jekyll-theme-hacker (0.2.0) 161 | jekyll (> 3.5, < 5.0) 162 | jekyll-seo-tag (~> 2.0) 163 | jekyll-theme-leap-day (0.2.0) 164 | jekyll (> 3.5, < 5.0) 165 | jekyll-seo-tag (~> 2.0) 166 | jekyll-theme-merlot (0.2.0) 167 | jekyll (> 3.5, < 5.0) 168 | jekyll-seo-tag (~> 2.0) 169 | jekyll-theme-midnight (0.2.0) 170 | jekyll (> 3.5, < 5.0) 171 | jekyll-seo-tag (~> 2.0) 172 | jekyll-theme-minimal (0.2.0) 173 | jekyll (> 3.5, < 5.0) 174 | jekyll-seo-tag (~> 2.0) 175 | jekyll-theme-modernist (0.2.0) 176 | jekyll (> 3.5, < 5.0) 177 | jekyll-seo-tag (~> 2.0) 178 | jekyll-theme-primer (0.6.0) 179 | jekyll (> 3.5, < 5.0) 180 | jekyll-github-metadata (~> 2.9) 181 | jekyll-seo-tag (~> 2.0) 182 | jekyll-theme-slate (0.2.0) 183 | jekyll (> 3.5, < 5.0) 184 | jekyll-seo-tag (~> 2.0) 185 | jekyll-theme-tactile (0.2.0) 186 | jekyll (> 3.5, < 5.0) 187 | jekyll-seo-tag (~> 2.0) 188 | jekyll-theme-time-machine (0.2.0) 189 | jekyll (> 3.5, < 5.0) 190 | jekyll-seo-tag (~> 2.0) 191 | jekyll-titles-from-headings (0.5.3) 192 | jekyll (>= 3.3, < 5.0) 193 | jekyll-watch (2.2.1) 194 | listen (~> 3.0) 195 | jemoji (0.12.0) 196 | gemoji (~> 3.0) 197 | html-pipeline (~> 2.2) 198 | jekyll (>= 3.0, < 5.0) 199 | kramdown (2.3.2) 200 | rexml 201 | kramdown-parser-gfm (1.1.0) 202 | kramdown (~> 2.0) 203 | liquid (4.0.4) 204 | listen (3.8.0) 205 | rb-fsevent (~> 0.10, >= 0.10.3) 206 | rb-inotify (~> 0.9, >= 0.9.10) 207 | mercenary (0.3.6) 208 | mini_portile2 (2.8.2) 209 | minima (2.5.1) 210 | jekyll (>= 3.5, < 5.0) 211 | jekyll-feed (~> 0.9) 212 | jekyll-seo-tag (~> 2.1) 213 | minitest (5.18.0) 214 | nokogiri (1.14.3) 215 | mini_portile2 (~> 2.8.0) 216 | racc (~> 1.4) 217 | octokit (4.25.1) 218 | faraday (>= 1, < 3) 219 | sawyer (~> 0.9) 220 | pathutil (0.16.2) 221 | forwardable-extended (~> 2.6) 222 | public_suffix (4.0.7) 223 | racc (1.6.2) 224 | rb-fsevent (0.11.2) 225 | rb-inotify (0.10.1) 226 | ffi (~> 1.0) 227 | rexml (3.2.5) 228 | rouge (3.26.0) 229 | ruby2_keywords (0.0.5) 230 | rubyzip (2.3.2) 231 | safe_yaml (1.0.5) 232 | sass (3.7.4) 233 | sass-listen (~> 4.0.0) 234 | sass-listen (4.0.0) 235 | rb-fsevent (~> 0.9, >= 0.9.4) 236 | rb-inotify (~> 0.9, >= 0.9.7) 237 | sawyer (0.9.2) 238 | addressable (>= 2.3.5) 239 | faraday (>= 0.17.3, < 3) 240 | simpleidn (0.2.1) 241 | unf (~> 0.1.4) 242 | terminal-table (1.8.0) 243 | unicode-display_width (~> 1.1, >= 1.1.1) 244 | typhoeus (1.4.0) 245 | ethon (>= 0.9.0) 246 | tzinfo (2.0.6) 247 | concurrent-ruby (~> 1.0) 248 | unf (0.1.4) 249 | unf_ext 250 | unf_ext (0.0.8.2) 251 | unicode-display_width (1.8.0) 252 | webrick (1.8.1) 253 | 254 | PLATFORMS 255 | ruby 256 | 257 | DEPENDENCIES 258 | github-pages 259 | jekyll 260 | jekyll-redirect-from 261 | webrick 262 | 263 | BUNDLED WITH 264 | 2.4.12 265 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Attribution-Share Alike 3.0 License. 2 | http://creativecommons.org/licenses/by-sa/3.0 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![first-timers-only](https://img.shields.io/badge/first--timers--only-friendly-blue.svg?style=flat-square)](https://www.firsttimersonly.com/) 2 | 3 | # PARTE 0 4 | 5 | # Como forkar o projeto 6 | 7 | No projeto Guides-ptbr clique no botão fork para fazer uma cópia do projeto para sua conta do github. 8 | 9 | ![GitHub Fork](/images/fork1.jpg) 10 | 11 | Logo depois de forkar você deve clicar no botão Clone or download e escolha se deseja clonar por SSH ou HTTPS. 12 | 13 | ![Clone Project](/images/cloneordownload.png) 14 | 15 | e no terminal digite `git clone` e cole a url do seu repositório fork. 16 | 17 | ```bash 18 | $ git clone git@github.com:YOUR-USERNAME/guides-ptbr.git 19 | ``` 20 | 21 | ## Como rodar o projeto 22 | 23 | Dentro do diretório `guides-ptbr` execute o comando abaixo para instalar todas as gems que o projeto precisa. 24 | 25 | ```bash 26 | $ bundle install 27 | ``` 28 | 29 | Depois de terminado de instalar todas as dependências basta executar 30 | 31 | ```bash 32 | $ bundle exec jekyll serve --watch 33 | ``` 34 | 35 | para iniciar o servidor e abrir no navegador com o endereço [http://localhost:4000](http://localhost:4000) 36 | 37 | ## Com Docker 38 | 39 | Construa a imagem localmente 40 | ``` 41 | docker build -t guides-ptbr . 42 | ``` 43 | 44 | Inicie o servidor e abrir no navegador com o endereço [http://localhost:4000](http://localhost:4000) 45 | ``` 46 | docker run --publish 4000:4000 --volume $(pwd):/app guides-ptbr 47 | ``` 48 | 49 | ## Como abrir um Pull Request 50 | 51 | Primeiro você deve está na branch `master`, execute o comando abaixo e verifique se está na `master` 52 | 53 | ```bash 54 | $ git branch 55 | ``` 56 | 57 | Conferido, agora crie uma nova branch para começar a fazer sua contribuição 58 | 59 | ```bash 60 | $ git checkout -b nome_da_sua_branch 61 | ``` 62 | 63 | Depois de terminar a sua contribuição crei o seu commit `git commit ...` e depois envie para o seu repositório `git push origin nome_da_sua_branch` 64 | 65 | Agora entre na github, vá até o seu repositório forkado e acesse a aba Pull Requests 66 | 67 | Na página de Pull Requests clique no botão Novo Pull Request, na página que vai aparecer você deve escolher qual a sua branch vai ser mergeada com a branch do projeto original. 68 | 69 | ![Criando Pull Request](/images/pull_request.png) 70 | 71 | O lado esquerdo é o nome do projeto e branch e o lado direito é o seu projeto e branch, basta escolher a branch você criou, colocar um título e descrição e seu Pull Request vai ser enviado. 72 | 73 | ## Algumas regras para seguir quando for efetuar as traduções 74 | 75 | - Tudo o que não for palavra reservada (e.g. variáveis, nomes de classes), traduzir para o português; 76 | - As referências a `COACH` serão traduzidos como `INSTRUTOR(A)`; 77 | - Se existir algum problema de clareza e compreensão a cerca do que está na versão original, corrigir no momento da tradução (é legal abrir um PR no guia em EN pra corrigir lá também); 78 | 79 | Para entender melhor acesse essa [issue](https://github.com/railsgirls/guides-ptbr/issues/24). 80 | 81 | # PARTE 1 82 | 83 | # Instruções para tradução da documentação do Rails Girls 84 | 85 | ## Como fazer para colaborar? 86 | 87 | Primeiramente, você deve dar um [fork](http://help.github.com/fork-a-repo/) no projeto para a sua conta. Com isso, você estará livre para fazer as traduções para o português. 88 | 89 | Quando finalizar algo, você deve dar um [pull request](http://help.github.com/pull-requests/) neste repositório para o seu conteúdo ser revisado e aprovado. Com isso, a sua tradução estará no repositório principal e com os seus devidos créditos. 90 | 91 | No final do projeto, será lançado oficialmente o site Rails Girls Brasil e divulgado. Todos os colaboradores serão citados e terão seus créditos mantidos. 92 | 93 | ## Como posso me candidatar a realizar uma tradução? 94 | 95 | Basta conferir a aba de `Issues` de repositório, se encontrar alguma tradução que interesse, adicione um comentário que começou a trabalhar nessa tradução. Será feito o máximo possível para manter a aba atualizada :) 96 | 97 | **Contamos com a colaboração de todos pois o sucesso deste projeto depende de todos nós que gostamos de compartilhar conhecimentos** 98 | 99 | ## Como atualizar meu fork com as novas atualizações deste repositório? 100 | 101 | git remote add upstream https://github.com/railsgirls/guides-ptbr.git (url origem do fork) 102 | git pull upstream gh-pages (nome do branch) 103 | git push 104 | 105 | --- 106 | 107 | # PARTE 2 108 | 109 | # Rails Girls Tutoriais 110 | 111 | Nosso objetivo é fornecer ferramentas para que mulheres estudem e entendam a tecnologia Rails. Os eventos Rails Girls foram criados com a finalidade de proporcionar uma primeira experiência com as técnicas Rails de criação para a Internet. 112 | 113 | Rails Girls foi criado na cidade de Helsinki no final do ano 2010. A intenção inicial foi a de criar um único evento local e nós jamais imaginamos que a ideia atingisse a proporção atual com a proliferação de vários eventos pelo mundo inteiro. Estes tutoriais foram criados para ajudá-lo a iniciar seus estudos de Rails. 114 | 115 | Você pode usar nosso material para criar seu próprio workshop na sua cidade, no seu ambiente de trabalho ou mesmo na sua cozinha! Saiba mais sobre Rails Girls em http://railsgirls.com 116 | 117 | ## Mãos à obra 118 | 119 | Leia os [tutoriais](http://guides.railsgirls.com/guides-ptbr/) ou clone este repositório, instale e rode [jekyll](https://github.com/mojombo/jekyll) 120 | 121 | ### Instalando jekyll 122 | 123 | ``` 124 | $ cd guides-ptbr 125 | ``` 126 | 127 | ``` 128 | $ bundle install 129 | ``` 130 | 131 | ### Pygments e Code Highlighting 132 | 133 | Os tutoriais foram criados com uso da biblioteca [pygments](http://pygments.org/) para destacar a sintaxe dos códigos. Se você não instalar a biblioteca não será possível visualizar o destaque nos blocos de código inseridos nos tutoriais, tais como o mostrado a seguir: 134 | 135 | ``` 136 | {% highlight %} 137 | {% endhighlight %} 138 | ``` 139 | 140 | Se você não pretende editar blocos de código, pode ignorar a biblioteca, mas se pretende instalá-la consulte as [instruções de instalação](http://jekyllrb.com/docs/installation/) na seção "Pygments" 141 | 142 | ### Rodando jekyll 143 | 144 | ``` 145 | $ bundle exec jekyll server --watch 146 | ``` 147 | 148 | ### Estilizando 149 | 150 | Atalhos de teclado devem ser marcados com o elemento HTML [kbd](https://www.w3.org/wiki/HTML/Elements/kbd) . 151 | 152 | Por questões de consistência de estilização use `Ctrl+C` e não `CTRL-c`/`ctrl+c` 153 | 154 | ``` 155 | Para parar o servidor pressione as teclas Ctrl+C 156 | ``` 157 | 158 | ### Encontrou um problema? 159 | 160 | Entre em contato com a Ana, no twitter: [@anaschwendler](https://twitter.com/anaschwendler) 161 | 162 | Caso jekyll não esteja funcionando como esperado consulte [Issue 503](https://github.com/mojombo/jekyll/issues/503) 163 | 164 | ## Contribuindo com um tutorial 165 | 166 | Para contribuir com um tutorial consulte as [instruções](http://guides.railsgirls.com/contributing) 167 | 168 | ## Twitter 169 | 170 | Para acompanhar atualizações e informações em geral siga [@railsgirls](https://twitter.com/railsgirls) 171 | 172 | ## Website e Blog 173 | 174 | O website e o blog de Rails Girls encontra-se hospedado em http://railsgirls.com 175 | 176 | ## Lista de e-mail 177 | 178 | A lista de e-mails de caráter global para os eventos de Rails Girls encontra-se em http://groups.google.com/group/rails-girls-team 179 | 180 | ## Créditos 181 | 182 | - Karri Saarinen / [@karrisaarinen](https://twitter.com/karrisaarinen) / [github](http://github.com/ksaa) 183 | - Linda Liukas / [@lindaliukas](https://twitter.com/lindaliukas) / [github](http://github.com/lindaliukas) 184 | - Vesa Vänskä / [@vesan](https://twitter.com/vesan) / [github](http://github.com/vesan) 185 | - Terence Lee / [@hone02](https://twitter.com/hone02) / [github](http://github.com/hone) 186 | 187 | ..e todos os instrutores(as) e pessoas envolvidas com o maravilhoso universo de Rails Girls. Seja mais um de nós! 188 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | permalink: pretty 2 | markdown: kramdown 3 | exclude: 4 | - ".rvmrc" 5 | - ".rbenv-version" 6 | - ".ruby-version" 7 | - "Gemfile" 8 | - "Gemfile.lock" 9 | - "README.md" 10 | -------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- 1 | 17 | -------------------------------------------------------------------------------- /_includes/github-corner.html: -------------------------------------------------------------------------------- 1 | 6 | 33 | -------------------------------------------------------------------------------- /_includes/header.html: -------------------------------------------------------------------------------- 1 |
2 | {% include github-corner.html %} 3 |
4 |
5 | 8 | 15 |
16 | 17 | 18 |
19 | 38 |
39 |
40 |
-------------------------------------------------------------------------------- /_includes/other-guides.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | ## Outros Guias 4 | 5 | - [Handy cheatsheet for Ruby, Rails, console etc.](http://www.pragtob.info/rails-beginner-cheatsheet/) 6 | - Guia 1: [Tutorial de Instalação para Rails Girls](/install) {% if include.page == 'install' %}(Você está aqui!){% endif %} 7 | - Guia 2: [Tutorial para criação da app Rails Girls](/app) {% if include.page == 'github' %}(Você está aqui!){% endif %} 8 | - Guia 3: [Como enviar para o GitHub](/github) {% if include.page == 'github' %}(Você está aqui!){% endif %} 9 | - Guia 4: Colocando seu app online em... 10 | - [Heroku](/heroku) {% if include.page == 'heroku' %}(Você está aqui!){% endif %} 11 | - [OpenShift](/openshift) {% if include.page == 'openshift' %}(Você está aqui!){% endif %} 12 | - [Anynines](/anynines) {% if include.page == 'anynines' %}(Você está aqui!){% endif %} 13 | - [Engine Yard](/engineyard) {% if include.page == 'engineyard' %}(Você está aqui!){% endif %} 14 | - Guia 5: [Funcionalidades de uma área de comentários para a app Rails Girls](/commenting) {% if include.page == 'commenting' %}(Você está aqui!){% endif %} 15 | - Guia 6: [Adicione design à sua aplicação com HTML e CSS](/design) {% if include.page == 'design' %}(Você está aqui!){% endif %} 16 | - Guia 7: [Thumbnails em listas de ideas](/thumbnails) {% if include.page == 'thumbnails' %}(Você está aqui!){% endif %} 17 | - Guia 8: [Autenticação (para usuários) com Devise](/devise) {% if include.page == 'devise' %}(Você está aqui!){% endif %} 18 | - Guia 9: [Adicionando Gravatar para a aplicação](/gravatar) {% if include.page == 'gravatar' %}(Você está aqui!){% endif %} 19 | - Guia 10: [Melhorando seu design da sua aplicação com HTML e CSS](/design-html-css) {% if include.page == 'design-html-css' %}(Você está aqui!){% endif %} 20 | - Guia 11: Continuous Deployment 21 | - [Testando seu app com RSpec](testing-rspec) {% if include.page == 'testing-rspec' %}(Você está aqui!){% endif %} 22 | - [CD with Travis-CI](/continuous-travis) {% if include.page == 'travis' %}(Você está aqui!){% endif %} 23 | - [CD with Codeship](/continuous) {% if include.page == 'continuous' %}(Você está aqui!){% endif %} 24 | - Guia 12: [Construindo um aplicativo de votação em Sinatra](/sinatra-app) {% if include.page == 'sinatra-app' %}(Você está aqui!){% endif %} 25 | - Guia 13: [Construa um diário em Ruby on Rails](diary-app) {% if include.page == 'diary-app' %}(Você está aqui!){% endif %} 26 | - Guia 14: [Adicione back-end ao seu aplicativo (páginas de administração)](/backend-with-active-admin) {% if include.page == 'active-admin' %}(Você está aqui!){% endif %} 27 | - Guia 15: [Acesse explicações adicionais do app Rails Girls](https://github.com/lbain/railsgirls/) -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{ page.title }} - Rails Girls 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | {% include header.html %} 23 |
24 |
25 | {{ content }} 26 |
27 |
28 | {% include footer.html %} 29 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /_posts/2012-04-19-contributing.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Contribua com um tutorial 4 | permalink: contributing 5 | --- 6 | 7 | # Instruções para contribuir com um tutorial 8 | 9 | *Traduzido por Maujor, [site do Maujor](http://www.maujor.com)* 10 | 11 | O site de tutoriais usa a tecnologia [jekyll](https://github.com/mojombo/jekyll) para renderizar suas páginas e todos os documentos do site são escritos com uso da sintaxe [markdown](http://daringfireball.net/projects/markdown/). Para contribuir com um ou mais ( ;-) ) tutoriais siga os seguinte passos: 12 | 13 | 1. Dê um fork no [repositório do github](https://github.com/railsgirlsmaceio/railsgirlsguides) clicando no botão "Fork". 14 | 2. Execute o comando `git clone` no seu fork. 15 | 16 | ## Se você quer criar um novo tutorial 17 | 18 | - Crie um arquivo denominado `YYYY-MM-DD-nome_do_tutorial.markdown` e salve no diretório `_posts` do seu fork. 19 | - No início do arquivo recém criado use a sintaxe YAML para serializar alguns dados que são padronizados para os tutoriais. Veja um exemplo destes dados que se aplica a este documento que você está visualizando: 20 | 21 | 22 | --- 23 | layout: default 24 | title: Contribua com um tutorial 25 | permalink: contributing 26 | --- 27 | 28 | 29 | - A seguir escreva seu tutorial usando a sintaxe markdown. 30 | 31 | Você pode tomar como base para seu tutorial a estrutura do tutorial [Rails Girls App Tutorial](https://github.com/railsgirlsmaceio/railsgirlsguides/blob/gh-pages/_posts/2012-04-18-app.markdown). 32 | 33 | ## Se você quer melhorar um tutorial já existente: 34 | Faça as mudanças no arquivo que você quer mudar! Você não precisa criar um novo arquivo se você quer mudar alguma coisa em um arquivo que já existe. 35 | 36 | ## Depois... 37 | 38 | 1. Commit seu tutorial para o seu repositório. 39 | 2. Feito o commit envie-o para seu fork. 40 | 3. Finalmente abra um pull request e nele acrescente uma breve descrição do seu tutorial. Feito! 41 | 42 | Nossos mais efusivos agradecimentos por dedicar seu tempo em favor do enriquecimento dos conteúdos do site Rails Girls. 43 | 44 | {% include other-guides.md page="contributing" %} 45 | -------------------------------------------------------------------------------- /_posts/2012-04-19-heroku.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Rails Girls — Heroku 4 | permalink: heroku 5 | --- 6 | 7 | # Publique sua aplicação com Heroku 8 | 9 | *Criado por Terence Lee, [@hone02](https://twitter.com/hone02)* 10 | *Traduzido por Maujor, [site do Maujor](http://www.maujor.com)* 11 | 12 | ### Observação importante 13 | O Heroku desde agosto de 2022 não oferece mais o serviço gratuito, porém dentro da plataforma existe uma alternativa para estudantes chamada [Heroku for Github Students](https://www.heroku.com/github-students), onde é necessário se cadastrar e enviar documentos necessários para a liberação de créditos dentro da plataforma. 14 | 15 | ### Instale Heroku 16 | 17 | Siga os passos intitulados "Introduction" e "Set up" constantes na página 18 | [Getting Started on Heroku with Ruby][heroku-guide] para se cadastrar, instalar Heroku CLI e fazer login. 19 | 20 | __INSTRUTOR(A)__: Fale sobre os benefícios do uso da plataforma Heroku para publicação vs uso de servidores tradicionais. 21 | 22 | [heroku-guide]: https://devcenter.heroku.com/articles/getting-started-with-ruby#introduction 23 | 24 | ### Preparando sua app 25 | 26 | #### Atualizando o banco de dados 27 | 28 | Em primeiro lugar precisamos fazer com que nosso banco de dados funcione na plataforma Heroku, que usa um banco de dados diferente. Altere o seguinte em Gemfile: 29 | 30 | {% highlight ruby %} 31 | gem 'sqlite3' 32 | {% endhighlight %} 33 | 34 | para 35 | 36 | {% highlight ruby %} 37 | group :development do 38 | gem 'sqlite3' 39 | end 40 | group :production do 41 | gem 'pg' 42 | end 43 | {% endhighlight %} 44 | 45 | Rode `bundle install --without production` para configurar suas dependências. 46 | 47 | Após isso, atualize o arquivo `config/database.yml`. 48 | Mude a seguinte parte do código: 49 | 50 | {% highlight yaml %} 51 | production: 52 | <<: *default 53 | database: db/production.sqlite3 54 | {% endhighlight %} 55 | 56 | para 57 | 58 | {% highlight yaml %} 59 | production: 60 | adapter: postgresql 61 | encoding: unicode 62 | database: railsgirls_production 63 | pool: 5 64 | {% endhighlight %} 65 | 66 | Não se esqueça de fazer `git add .` e `git commit -m "Utilizando postgres como banco de dados de producao"` 67 | para adicionar esta mudança ao seu branch master antes de enviar ao heroku mais tarde. 68 | 69 | __INSTRUTOR(A)__: Você pode falar sobre RDBMS e as diferenças para outros sistemas de gerenciamento bem como apresentar alguns detalhes das dependências em Heroku no PostgreSQL. 70 | 71 | #### Sistema de controle de versão 72 | 73 | Para começar vamos adicionar nosso código em um sistema de controle de versão. Você pode fazer isso executando os seguintes comandos no terminal: 74 | 75 | {% highlight sh %} 76 | git init 77 | git add . 78 | git commit -m "initial commit" 79 | {% endhighlight %} 80 | 81 | __INSTRUTOR(A)__: Agora é uma ótima oportunidade para falar sobre sistemas de controle de versão e git. 82 | 83 | ### Publicando sua app 84 | 85 | #### Criando a app 86 | 87 | Precisamos criar nossa aplicação heroku executando `heroku create` no terminal. 88 | Esta ação mostrará no terminal o seguinte: 89 | 90 | {% highlight sh %} 91 | Creating app... done, ⬢ young-reaches-87845 92 | https://young-reaches-87845.herokuapp.com/ | https://git.heroku.com/young-reaches-87845.git 93 | {% endhighlight %} 94 | 95 | Neste caso "young-reaches-87845" é o nome da sua aplicação 96 | 97 | #### Fazendo o pushing do código 98 | 99 | A seguir precisamos fazer o push do código para o heroku excutando `git push heroku master`. Você verá a saída do push como mostrado a seguir: 100 | 101 | {% highlight sh %} 102 | Counting objects: 115, done. 103 | Delta compression using up to 8 threads. 104 | Compressing objects: 100% (97/97), done. 105 | Writing objects: 100% (115/115), 25.62 KiB | 0 bytes/s, done. 106 | Total 115 (delta 10), reused 0 (delta 0) 107 | remote: Compressing source files... done. 108 | remote: Building source: 109 | remote: 110 | remote: -----> Ruby app detected 111 | remote: -----> Compiling Ruby/Rails 112 | remote: -----> Using Ruby version: ruby-2.2.4 113 | remote: -----> Installing dependencies using bundler 1.11.2 114 | remote: Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment 115 | remote: Fetching gem metadata from https://rubygems.org/.......... 116 | remote: Fetching version metadata from https://rubygems.org/... 117 | remote: Fetching dependency metadata from https://rubygems.org/.. 118 | remote: Installing concurrent-ruby 1.0.2 119 | ... 120 | remote: -----> Launching... 121 | remote: Released v5 122 | remote: https://young-reaches-87845.herokuapp.com/ deployed to Heroku 123 | remote: 124 | remote: Verifying deploy... done. 125 | To https://git.heroku.com/young-reaches-87845.git 126 | * [new branch] master -> master 127 | {% endhighlight %} 128 | 129 | O envio estará terminado com êxito quando aparecer o texto “Launching…” como mostrado anteriomente. 130 | 131 | #### Migrando o banco de dados 132 | 133 | Precisamos migrar nosso banco de dados tal como fizemos localmente durante o workshop: 134 | 135 | {% highlight sh %} 136 | heroku run rake db:migrate 137 | {% endhighlight %} 138 | 139 | Depois que esse comando for executado você poderá acessar a app na sua URL. Para a aplicação que desenvolvemos nesse exemplo abra: . 140 | Opcionalmente, para visitar a página, você pode executar `heroku open` no terminal. 141 | 142 | #### Notas finais 143 | 144 | A plataforma Heroku tem suas peculiaridades. Nela os aplicativos são executados em tempo real dentro de um ambiente efêmero - isso significa que (exceto para informações armazenadas em seu banco de dados) quaisquer arquivos criados por seu aplicativo irá desaparecer quando ele for reiniciado (por exemplo, quando você atualiza para uma nova versão). 145 | 146 | ###### [Sistema de arquivos efêmero][ephemeral-filesystem] 147 | 148 | > Cada container dyno cria seu próprio sistema de arquivos efêmero contendo uma cópia 149 | > do mais recente código publicado. Durante o período de vida do dyno os processos nele rodando 150 | > usam um sistema de arquivos que são escritos em um rascunho temporário, contudo nenhum destes arquivos 151 | > são visíveis para processamento em qualquer outro dyno, tais arquivos serão 152 | > descartados no momento em que o dyno for parado ou restartado. Por exemplo, isso 153 | > acontece sempre que o dyno é substituído em decorrência uma implantação de aplicativos e, também, 154 | > em média uma vez por dia, pois assim está previsto pelo mecanismo de gestão nativo do dyno. 155 | 156 | No [tutorial para criação do App](app) a funcionalidade que prevê a gravação de arquivos em uma Idea, permite escrever arquivos no diretório `public/uploads` das suas aplicações . Você pode constatar o armazenamento efêmero em Heroku seguindo os seguintes passos: 157 | 158 | 1. Inicie a aplicação executando o comando `heroku open` 159 | 2. Adicione uma nova Idea e nela uma imagem 160 | 3. Reinicie a aplicação executando o comando `heroku restart` 161 | 4. Volte para a página da Idea e recarregue - a imagem não será mais visível 162 | 163 | [ephemeral-filesystem]: https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem 164 | 165 | ##### Contornando o armazenamento efêmero 166 | 167 | É óbvio que armazenamento efêmero não é conveniente quando se trata de uma aplicação real, mas existem métodos para contornar o problema que são usados em muitos websites populares. 168 | 169 | O método mais comum consiste em se usar um serviço de hospedagem externo, tais como, Amazon S3 (Simple Storage Service) ou Rackspace CloudFiles para hospedar os *assets* da aplicação. Tais serviços disponibilizam (por um custo baixo - em geral $0.10 por GB) armazenamento 'na nuvem' (os arquivos podem ser hospedados em qualquer lugar) proporcionando um armazenamento persistente para sua aplicação. 170 | 171 | Não é do escopo deste tutorial detalhar a hospedagem 'na nuvem', mas se você estiver interessado em mais informações a respeito seguem alguns links úteis: 172 | 173 | * [How to: Make Carrierwave work on Heroku](https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-Make-Carrierwave-work-on-Heroku) 174 | * [Amazon S3 – The Beginner’s Guide](http://www.hongkiat.com/blog/amazon-s3-the-beginners-guide/) 175 | 176 | Como sempre, se você precisar de mais informações ou assistência pergunte aos seus instrutores(as). 177 | 178 | {% include other-guides.md page="heroku" %} 179 | -------------------------------------------------------------------------------- /_posts/2012-04-30-commenting.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Funcionalidades de uma área de comentários para a app Rails Girls 4 | permalink: commenting 5 | --- 6 | # Área de comentários para a app Rails Girls 7 | 8 | *Criado por Janika Liiv, [@janikaliiv](https://twitter.com/janikaliiv)* 9 | 10 | *Traduzido por Maujor, [site do Maujor](http://www.maujor.com)* 11 | 12 | *Atualizado por Tayllan, [@mtayllan](https://github.com/mtayllan)* 13 | 14 | Vamos aprender como criar uma área de comentários para nossa app *railsgirls* ideas. 15 | 16 | As instruções para criar a app foram descritas [neste documento](/app). 17 | 18 | ## _1._ Criando o scaffold para a área de comentários 19 | 20 | Crie o scaffold para a área de comentários fazendo nele constar o nome de quem comenta, o corpo do comentário (conteúdo do comentário) e uma referência para a tabela ideas (`idea_id`). 21 | {% highlight sh %} 22 | rails g scaffold comment user_name:string body:text idea_id:integer 23 | {% endhighlight %} 24 | Esta ação criará um arquivo de migração que permitirá ao banco de dados conhecer a nova tabela de comentários. A seguir migre as alterações feitas no banco de dados digitando no terminal o seguinte: 25 | {% highlight sh %} 26 | rails db:migrate 27 | {% endhighlight %} 28 | 29 | ## _2._ Adicione relacionamentos aos modelos 30 | 31 | Você precisa assegurar que Rails seja capaz de identificar a conexão entre objetos (ideas e comentários). De vez que uma idea pode ter vários comentários precisamos assegurar que o modelo ideas sabe disso. Abra `app/models/idea.rb` e logo após a linha: 32 | {% highlight ruby %} 33 | class Idea < ApplicationRecord 34 | {% endhighlight %} 35 | acrescente o seguinte: 36 | {% highlight ruby %} 37 | has_many :comments 38 | {% endhighlight %} 39 | 40 | Um comentário precisa saber que ele pertence a uma idea. Assim, abra `app/models/comment.rb` e logo após a linha: 41 | {% highlight ruby %} 42 | class Comment < ApplicationRecord 43 | {% endhighlight %} 44 | 45 | acrescente a seguinte linha: 46 | {% highlight ruby %} 47 | belongs_to :idea 48 | {% endhighlight %} 49 | 50 | ## _3._ Mostrar o formulário de comentários e os comentários existentes 51 | 52 | Abra `app/views/ideas/show.html.erb` é depois da tag de imagem (`image_tag`) 53 | {% highlight erb %} 54 | <%= image_tag(@idea.picture_url, :width => 600) if @idea.picture.present? %> 55 | {% endhighlight %} 56 | 57 | acrescente a seguinte linha: 58 | {% highlight erb %} 59 |

Comentários

60 | <% @comments.each do |comment| %> 61 |
62 | <%= comment.user_name %> 63 |
64 |

<%= comment.body %>

65 |

<%= link_to 'Delete', comment_path(comment), method: :delete, data: { confirm: 'Tem certeza?' } %>

66 |
67 | <% end %> 68 | <%= render partial: 'comments/form', locals: { comment: @comment } %> 69 | {% endhighlight %} 70 | 71 | Em `app/controllers/ideas_controller.rb` acrescente a ação mostrar logo após a linha: 72 | {% highlight ruby %} 73 | @comments = @idea.comments.all 74 | @comment = @idea.comments.build 75 | {% endhighlight %} 76 | 77 | Abra `app/views/comments/_form.html.erb` e logo após a linha: 78 | {% highlight erb %} 79 |
80 | <%= form.label :body %>
81 | <%= form.text_area :body, id: :comment_body %> 82 |
83 | {% endhighlight %} 84 | 85 | acrescente a seguinte linha: 86 | {% highlight erb %} 87 | <%= form.hidden_field :idea_id %> 88 | {% endhighlight %} 89 | 90 | a seguir remova 91 | {% highlight erb %} 92 |
93 | <%= form.label :idea_id %>
94 | <%= form.number_field :idea_id %> 95 |
96 | {% endhighlight %} 97 | 98 | Pronto! Visualize uma idea que você tenha acrescentado à sua aplicação e você verá ali o formulário para inserir um comentário bem como a funcionalidade para deletar comentários. 99 | 100 | {% include other-guides.md page="commenting" %} 101 | -------------------------------------------------------------------------------- /_posts/2012-06-03-thumbnails.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Thumbnails em listas de ideas 4 | permalink: thumbnails 5 | --- 6 | 7 | # Criando thumbnails com Carrierwave 8 | 9 | *Criado por Miha Filej, [@mfilej](https://twitter.com/mfilej)* 10 | *Traduzido por Maujor, [site do Maujor](http://www.maujor.com)* 11 | 12 | __INSTRUTOR(A)__: Explicar qual o efeito de se definir a largura de uma imagem na marcação HTML como explicado no final do passo 4, constante do tutorial *Tutorial para criação da app Rails Girls*. 13 | 14 | ## *1.* Instalando ImageMagick 15 | 16 | * macOS: rode `brew install imagemagick`. Se o comando brew não estiver disponível no seu terminal, instale [install Homebrew here][in-homebrew]. 17 | * Windows: faça o download e rode o [ImageMagick installer][im-win] (use o primeiro link do *download* ). 18 | * Linux: em Ubuntu e Debian, rode `sudo apt-get install imagemagick`. Use o gerenciador de package apropriado em lugar de `apt-get` para as demais distribuições Linux. 19 | 20 | [im-win]: http://www.imagemagick.org/script/binary-releases.php?ImageMagick=vkv0r0at8sjl5qo91788rtuvs3#windows 21 | [in-homebrew]: http://mxcl.github.io/homebrew/ 22 | 23 | __INSTRUTOR(A)__: Explique o que é ImageMagick e qual a diferença para outras bibliotecas/gems que já usamos anteriormente? 24 | 25 | Abra `Gemfile` no seu projeto e acrescente o seguinte: 26 | 27 | {% highlight ruby %} 28 | gem 'mini_magick' 29 | {% endhighlight %} 30 | 31 | logo após a linha 32 | 33 | {% highlight ruby %} 34 | gem 'carrierwave' 35 | {% endhighlight %} 36 | 37 | No Terminal rode: 38 | 39 | {% highlight sh %} 40 | bundle 41 | {% endhighlight %} 42 | 43 | ## *2.* Dizendo para a app criar um thumbnail quando uma imagem for enviada ao servidor 44 | 45 | Abra `app/uploaders/picture_uploader.rb` e encontre a linha conforme mostrada a seguir: 46 | 47 | {% highlight ruby %} 48 | # include CarrierWave::MiniMagick 49 | {% endhighlight %} 50 | 51 | Remova o sinal `#`. 52 | 53 | __INSTRUTOR(A)__: Explicar o uso e finalidades da inserção de comentários nos códigos. 54 | 55 | Logo após a linha que você acabou de descomentar acrescente o seguinte: 56 | 57 | {% highlight ruby %} 58 | version :thumb do 59 | process :resize_to_fit => [50, 50] 60 | end 61 | {% endhighlight %} 62 | 63 | A partir de agora as imagens enviadas ao servidor serão redimensionadas para criar thumbnails, contudo aquelas já existentes no servidor não serão afetadas. Edite uma das ideas já existentes e reenvie a imagem para o servidor. 64 | 65 | ## *3.* Mostrando thumbnails 66 | 67 | Para verificar se uma imagem enviada ao servidor foi redimensionada abra 68 | `app/views/ideas/index.html.erb`. Altere a linha 69 | 70 | {% highlight erb %} 71 | <%= idea.picture %> 72 | {% endhighlight %} 73 | 74 | para 75 | 76 | {% highlight erb %} 77 | <%= image_tag idea.picture_url(:thumb) if idea.picture? %> 78 | {% endhighlight %} 79 | 80 | Dê uma olhada na lista das ideas, no navegador, para verificar se o thumbnail está ali. 81 | 82 | {% include other-guides.md page="thumbnails" %} 83 | -------------------------------------------------------------------------------- /_posts/2012-11-01-devise.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Autenticação com Devise 4 | permalink: devise 5 | --- 6 | 7 | # Autenticação com Devise 8 | 9 | *Criado por Piotr Steininger, [@polishprince](https://twitter.com/polishprince)* 10 | 11 | *Atualizado por Ernesto Jimenez, [@ernesto_jimenez](https://twitter.com/ernesto_jimenez)* 12 | 13 | *Traduzido por Maujor, [site do Maujor](http://www.maujor.com)* 14 | 15 | **Esse guia assume que você já criou a app RailsGirls como mostrado no** [**tutorial para criação da app Rails Girls**](/app). 16 | 17 | 18 | ## *1.* Adicione a gem Devise 19 | 20 | Abra sua `Gemfile` e acrescente a seguinte linha de código: 21 | 22 | {% highlight ruby %} 23 | gem 'devise' 24 | {% endhighlight %} 25 | e execute 26 | {% highlight sh %} 27 | bundle install 28 | {% endhighlight %} 29 | para instalar a gem. **Não se esqueça de restartar o servidor Rails**. 30 | 31 | ## *2.* Configure devise na sua app 32 | 33 | Execute o seguinte comando no terminal: 34 | 35 | {% highlight sh %} 36 | rails g devise:install 37 | {% endhighlight %} 38 | 39 | 40 | ## *3.* Configure Devise 41 | 42 | Assegure-se de ter definido as opções default para URL no ambiente dos seus arquivos. Abra `config/environments/development.rb` e adicione a seguinte linha de código: 43 | {% highlight ruby %} 44 | config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } 45 | {% endhighlight %} 46 | 47 | antes da palavra-chave `end`. 48 | 49 | Abra `app/views/layouts/application.html.erb` e adicione o seguinte: 50 | 51 | {% highlight erb %} 52 | <% if notice %> 53 |

<%= notice %>

54 | <% end %> 55 | <% if alert %> 56 |

<%= alert %>

57 | <% end %> 58 | {% endhighlight %} 59 | acima de 60 | {% highlight ruby %} 61 | <%= yield %> 62 | {% endhighlight %} 63 | 64 | Abra `app/views/ideas/show.html.erb` e remova a seguinte linha: 65 | 66 | {% highlight erb %} 67 |

<%= notice %>

68 | {% endhighlight %} 69 | 70 | Faça o mesmo em `app/views/comments/show.html.erb`. Aquelas linhas não são necessárias, pois nós acrescentamos notice no arquivo `app/views/layouts/application.html.erb`. 71 | 72 | ## *4.* Configure o modelo de usuários 73 | 74 | Usaremos um script gerador de empacotamento para criar o modelo de usuários. 75 | {% highlight sh %} 76 | rails g devise user 77 | rake db:migrate 78 | {% endhighlight %} 79 | 80 | **Instrutor(a):** Explicar qual foi o modelo de usuário criado. Qual a finalidade dos campos? 81 | 82 | ## *5.* Criando o primeiro usuário 83 | 84 | Agora que está tudo devidamente configurado podemos criar nosso primeiro usuário. Devise gera todos os códigos e caminhos necessários para criar contas, log in, log out, etc. 85 | 86 | Certifique-se de que o servidor rails está rodando, abra e crie uma conta de usuário. 87 | 88 | ## *6.* Crie links para cadastramento e login 89 | 90 | Agora só nos resta criar links e notificação de usuário logado no canto superior direito da barra de navegação. 91 | 92 | Para fazer isso edite `app/views/layouts/application.html.erb` e acrescente as seguintes linhas: 93 | {% highlight erb %} 94 | 114 | {% endhighlight %} 115 | 116 | Para finalizar force o usuário a ser redirecionado para a página de login se ele não estiver logado. Abra `app/controllers/application_controller.rb` e adicione a seguinte linha: 117 | 118 | {% highlight ruby %} 119 | before_action :authenticate_user! 120 | {% endhighlight %} 121 | 122 | depois de `class ApplicationController < ActionController::Base`. 123 | 124 | Abra seu navegador e execute as ações de login e logout. 125 | 126 | **Instrutor(a):** Falar sobre `user_signed_in?` e `current_user` helpers. Qual é a utilidade destas funcionalidades? 127 | 128 | ## O que vem a seguir? 129 | 130 | * Acrescente campos extras no modelo de usuários 131 | * Adicione relacionamentos entre usuários e ideas 132 | * Crie restrições de modo a permitir que usuários editem somente suas próprias ideas e apague seus próprios comentários 133 | * Permita expandir roles ou permissões para usuários (use uma das gem populares, tal como like CanCan) 134 | 135 | {% include other-guides.md page="devise" %} 136 | -------------------------------------------------------------------------------- /_posts/2013-01-20-design.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Adicione design Usando HTML & CSS 4 | permalink: design 5 | --- 6 | 7 | # Adicione design Usando HTML & CSS 8 | 9 | *Criado por Alex Liao, [@alexliao](http://bannka.com/alex)* 10 | 11 | *Traduzido por José Viera [@NetoDevel](https://github.com/NetoDevel)* 12 | 13 | Agora o aplicativo está funcionando bem, mas ainda se parece com scaffold. Vamos adicionar algum design para torná-lo parecido com um site profissional. Quando terminar este tutorial, o aplicativo será parecido com [esse](http://railsgirlsapp.herokuapp.com/ideas). 14 | 15 | ## *1.* Delete CSS scaffold indesejado 16 | 17 | 18 | Abra `app/assets/stylesheets/application.css`, e substitua a linha 19 | 20 | {% highlight css %} 21 | body { padding-top: 100px; } 22 | {% endhighlight %} 23 | 24 | com 25 | 26 | {% highlight css %} 27 | body { padding-top: 60px; } 28 | {% endhighlight %} 29 | 30 | Finalmente, exclua o arquivo `app/assets/stylesheets/scaffolds.scss` porque nós realmente não precisamos do estilo padrão gerado pelo Rails. 31 | 32 | Agora vamos atualizar a página na url . Você não vai encontrar muita mudança, mas é uma boa preparação para as etapas seguintes. 33 | 34 | ## *2.* Refinar a navegação 35 | 36 | Considerando que "ideia" é o objeto mais importante na sua aplicação, nós vamos colocar o botão "New Idea" na barra de navegação para torná-lo sempre disponível. 37 | 38 | Abra `app/views/layouts/application.html.erb`, e abaixo da linha 39 | 40 | {% highlight erb %} 41 | 44 | {% endhighlight %} 45 | 46 | adicione 47 | {% highlight erb %} 48 | 51 | {% endhighlight %} 52 | 53 | ## *3.* Design para a lista de ideias 54 | 55 | Agora é hora de fazer a página de listar ideias parecer mais profissional. Para isso, vamos substituir o layout da tabela com um layout div. 56 | 57 | **Instrutor(a):** Fale um pouco sobre a tabela vs div. 58 | 59 | Abra `app/views/ideas/index.html.erb` em seu editor de texto e substitua todas as linhas com 60 | 61 | {% highlight erb %} 62 |

Listing ideas

63 | 64 | <% @ideas.in_groups_of(3) do |group| %> 65 |
66 | <% group.compact.each do |idea| %> 67 |
68 | <%= image_tag idea.picture_url, width: '100%' if idea.picture.present?%> 69 |

<%= link_to idea.name, idea %>

70 | <%= idea.description %> 71 |
72 | <% end %> 73 |
74 | <% end %> 75 | {% endhighlight %} 76 | 77 | **Instrutor(a):** Explique o que o novo código significa linha por linha, e fale um pouco sobre o grid do Bootstrap 78 | 79 | Atualize! Nós ficamos com uma boa lista de ideias com design bonito. Clique no botão "New Idea", e crie mais ideias com o texto real e imagens bonitas, a página ficará muito melhor com o conteúdo. Há um princípio de web design contemporâneo: o conteúdo é a melhor decoração. 80 | 81 | ## *4.* Design para a página de detalhes da ideia 82 | 83 | Clique no título de uma ideia, e você será levado para a página de detalhes da ideia. Agora ainda é scaffold gerado pelo Rails, então vamos melhorar a página. 84 | 85 | Abra `app/views/ideas/show.html.erb` em seu editor de texto e substitua todas as linhas com 86 | 87 | {% highlight erb %} 88 |

<%= notice %>

89 | 90 |
91 |
92 | <%= image_tag(@idea.picture_url, width: '100%') if @idea.picture.present? %> 93 |
94 | 95 |
96 |

Name: <%= @idea.name %>

97 |

Description: <%= @idea.description %>

98 |

99 | <%= link_to 'Edit', edit_idea_path(@idea) %> | 100 | <%= link_to 'Destroy', @idea, data: { confirm: 'Are you sure?' }, method: :delete %> | 101 | <%= link_to 'Back', ideas_path %> 102 |

103 |
104 |
105 | {% endhighlight %} 106 | 107 | 108 | **Instrutor(a):** Explique o que o novo código significa linha por linha. 109 | 110 | ## E agora? 111 | 112 | * Use o seu novo conhecimento para projetar um novo formulário para ideia 113 | * Adicione mais design para as páginas como você deseja 114 | * Siga os outros guias para aprender mais sobre Rails 115 | 116 | {% include other-guides.md page="design" %} 117 | -------------------------------------------------------------------------------- /_posts/2013-04-14-github.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | 4 | title: Como enviar para o GitHub 5 | 6 | permalink: github 7 | --- 8 | 9 | # Envie seu app para o GitHub 10 | 11 | *Criado por Alyson La, [@realalysonla](https://www.twitter.com/realalysonla)* 12 | *Traduzido por Marina Limeira, [@marinalimeira_](https://www.twitter.com/marinalimeira_)* 13 | 14 | ## O que você precisa antes de começar 15 | 16 | ### Git & GitHub 17 | 18 | * Verifique se o Git está instalado 19 | * No terminal digite `git --version` (preferível a versão 1.8 ou superior) 20 | 21 | * Se não, baixe o Git [aqui] (http://git-scm.com/downloads). 22 | Então, configure seu perfil Git localmente - No terminal: 23 | * Digite `git config --global user.name "seu-nome"` 24 | * Digite `git config --global user.email "seu-email"` 25 | 26 | * _Para checar se o Git já está configurado, você pode digitar_ `git config --list` 27 | 28 | * Crie uma conta gratuita no [GitHub](https://github.com) ou logue se você já possui uma 29 | 30 | **Instrutor(a):** Fale um pouco sobre git, controle de versão e open source 31 | 32 | ## Envie seu app para o GitHub utilizando a linha de comando 33 | 34 | No seu perfil do GitHub clique em "new repo" ![screen shot 2013-06-01 at 12 38 50 pm](https://f.cloud.github.com/assets/2623954/595307/eb70c6cc-caf2-11e2-9d2d-60deb31ac049.png) de um nome (exemplo: rails-girls), breve descrição, escolha a opção "público", e clique em "Criar repositório". 35 | 36 | Na linha de comando (tenha certeza de que você entrou na sua pasta rails-girls utilizando `cd`) e insira: 37 | 38 | {% highlight sh %} 39 | git init 40 | {% endhighlight%} 41 | 42 | Isso inicializa um repositório git no seu projeto 43 | 44 | *Nota:* Se você já concluiu o [guia Heroku](/heroku), então você já inicializou um repositório git e pode prosseguir para os próximos passos. 45 | 46 | Depois, verifique se um arquivo chamado `README.rdoc` existe na sua pasta rails-girls: 47 | 48 |
49 |
50 | {% highlight sh %} 51 | ls README.rdoc 52 | {% endhighlight %} 53 |
54 |
55 | {% highlight sh %} 56 | dir README.rdoc 57 | {% endhighlight %} 58 |
59 |
60 | 61 | Se o arquivo não existe, você pode criá-lo digitando: 62 | 63 | {% highlight sh %} 64 | touch README.rdoc 65 | {% endhighlight %} 66 | 67 | Ou se você está utilizando Windows, digite o seguinte comando: 68 | 69 | {% highlight sh %} 70 | type nul > README.rdoc 71 | {% endhighlight %} 72 | 73 | **Instrutor(a):** Fale um pouco sobre README.rdoc 74 | 75 | Então digite: 76 | 77 | {% highlight sh %} 78 | git status 79 | {% endhighlight %} 80 | 81 | Isso irá listar todos os arquivos no seu diretório de trabalho. 82 | 83 | **Instrutor(a):** Fale um pouco sobre os seus comandos git favoritos 84 | 85 | Então digite: 86 | 87 | {% highlight sh %} 88 | git add . 89 | {% endhighlight %} 90 | 91 | Isso adiciona todos os seus arquivos e alterações numa área temporária. 92 | 93 | Então digite: 94 | 95 | {% highlight sh %} 96 | git commit -m "primeiro commit" 97 | {% endhighlight %} 98 | 99 | Isso commita todos os seus arquivos, adicionando a mensagem "primeiro commit" 100 | 101 | Então digite: 102 | 103 | {% highlight sh %} 104 | git remote add origin https://github.com/usuario/rails-girls.git 105 | {% endhighlight %} 106 | 107 | _A página do seu repositório GitHub mostrará a URL do seu repositório, então sinta-se a vontade para copiar e colar de lá, melhor do que inserir manualmente. Você pode copiar e colar o link da página do seu repositório GitHub clicando em "Clone or download"._ 108 | 109 | Isso cria um remoto, ou _conexão_ chamado "origin" apontando para o seu repositório GitHub que você acabou de criar. 110 | 111 | Então digite: 112 | 113 | {% highlight sh %} 114 | git push -u origin master 115 | {% endhighlight %} 116 | 117 | Isso envia seus commits para sua branch "master" no GitHub 118 | 119 | Parabéns pelo seu primeiro app no GitHub! Você pode conferir utilizando a mesma url que você utilizou antes: https://github.com/usuario/rails-girls (sem a pasta .git) 120 | 121 | Se quiser continuar fazendo alterações e as enviando para o GitHub, você precisará utilizar os três seguintes comandos: 122 | 123 | {% highlight sh %} 124 | git add . 125 | git commit -m "digite sua mensagem de commit aqui" 126 | git push origin master 127 | {% endhighlight %} 128 | 129 | ## E agora? 130 | 131 | ### Seja parte da comunidade open source 132 | 133 | * Siga seus colegas e instrutores(as) do RailsGirls no GitHub 134 | * Favorite ou assista seus repositórios 135 | * Faça o [fork](https://help.github.com/articles/fork-a-repo) de um repositório, e então clone e envie alterações do seu fork. Compartilhe as alterações com o criador original o enviando um [pull request](https://help.github.com/articles/using-pull-requests)! 136 | * Crie uma issue em um projeto quando você encontrar um bug 137 | * Explore outros projetos open source - procure por alguma linguagem de programação ou palavra chave 138 | 139 | ### Aprenda mais sobre Git 140 | 141 | * Confira [trygit.org](http://try.github.io/) 142 | * Use um [Git Cheatsheet](https://github.github.com/training-kit/downloads/pt_BR/github-git-cheat-sheet/) ([PDF](https://github.github.com/training-kit/downloads/pt_BR/github-git-cheat-sheet.pdf)) 143 | * Veja outros comandos Git em [git-scm.org](http://git-scm.com/) 144 | 145 | {% include other-guides.md page="github" %} 146 | -------------------------------------------------------------------------------- /_posts/2013-05-10-EYDeploy.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Rails Girls no Engine Yard 4 | permalink: engineyard 5 | --- 6 | 7 | # Coloque sua aplicação online com Engine Yard 8 | 9 | *Criado por Mary Jenn, [@mfjenn](https://twitter.com/mfjenn)* 10 | 11 | *Traduzido por Letícia, [@_leticia](https://twitter.com/_leticia)* 12 | 13 | #### Certifique-se que você está utilizando PostgreSQL como banco de dados 14 | 15 | Você precisará fazer com que seu banco de dados funcione no Engine Yard, que 16 | utiliza um banco diferente do padrão do Rails. Por favor, substitua o seguinte 17 | código no arquivo `Gemfile`: 18 | 19 | {% highlight ruby %} 20 | gem 'sqlite3' 21 | {% endhighlight %} 22 | 23 | para 24 | 25 | {% highlight ruby %} 26 | group :development do 27 | gem 'sqlite3' 28 | end 29 | 30 | 31 | group :production do 32 | gem 'pg' 33 | end 34 | {% endhighlight %} 35 | 36 | 37 | Execute `bundle install --without production` para configurar suas 38 | dependências. 39 | 40 | #### Sistemas de controle de versão 41 | 42 | Você precisa adicionar sua aplicação ao seu repositório Git. Você pode fazer 43 | isso executando o seguinte no seu terminal: 44 | 45 | {% highlight sh %} 46 | git init 47 | {% endhighlight %} 48 | 49 | {% highlight sh %} 50 | git add . 51 | {% endhighlight %} 52 | 53 | {% highlight sh %} 54 | git commit -m "initial commit" 55 | {% endhighlight %} 56 | 57 | __TREINADORA__: Esta seria uma boa hora para falar sobre sistemas de versionamento e Git. 58 | 59 | ### Assegure que você tenha uma aplicação Rails em um repositório no GitHub 60 | 61 | Você precisará ter uma conta no GitHub e um repositório onde encontraremos sua 62 | aplicação. Siga estas instruções em [GitHub](https://help.github.com/articles/create-a-repo) para criar um repositório e submeter sua aplicação a ele. Se você não tem uma aplicação Rails funcionando, você pode fazer a cópia da [aplicação de exemplo da Engine Yard](https://github.com/engineyard/todo) para seu próprio repositório. Uma treinadora pode lhe ajudar se precisar. 63 | 64 | ### Registre-se para uma conta de teste grátis na Engine Yard 65 | 66 | Navegue até o [site](https://www.engineyard.com/) da Engine Yard e clique em "GET STARTED FREE" ("inicie gratuitamente") para obter suas 500 horas de teste grátis. O registro lhe enviará um e-mail de confirmação; verifique seu e-mail, clique no link e entre em sua conta. Clique no link sob "Your available applications" ("Suas aplicações disponíveis") que diz "Engine Yard Cloud". Isto leva ao seu painel. 67 | 68 | ### Crie sua conta Engine Yard Cloud 69 | 70 | 1. Escolha um nome para sua conta. Sugerimos escolher algo relevante a quem você é, seja como desenvolvedora ou uma organização, se você tem colaboradores. Clique no botão "Start Trial" ("Começar Teste Grátis"). 71 | 72 | 2. Fique à vontade para explorar os menus, mas vamos usar os padrões por ora, já que eles estão alinhados com uma aplicação Rails básica. 73 | 74 | 3. No campo com o nome "Git Repository URI" ("URI do repositório Git"), cole o endereço de seu repositório GitHub. Assegure-se de utilizar o endereço da versão SSH de sua aplicação. DICA: O formato deve ser como o do texto em sua página da aplicação Engine Yard (ou como este: "git@github.com:mfjenn/blogotron.git") 75 | 76 | 77 | ### Colocando sua chave de deploy 78 | 79 | Você deve estar agora em uma página que diz "Permitir que a Engine Yard acesse 80 | seu repositório privado". 81 | 82 | 1. Copie o bloco de texto da caixa e navegue até a página de configurações do GitHub; 83 | 2. Vá até a página "SSH"; 84 | 3. Clique no botão que diz "add a key" ("adicionar uma chave"); 85 | 4. Cole o bloco de texto de sua página da Engine Yard no campo e salve; 86 | 5. Volte à sua página na Engine Yard e clique no botão que diz "My deploy key is in place" ("minha chave de deploy está correta"). 87 | 88 | __TREINADORA__: Explique a diferença entre repositórios públicos e privados e quando utilizá-los. 89 | 90 | ### Criando e configurando seu ambiente 91 | 92 | Assim que você clicar no botão "My deploy key is in place" ("minha chave de deploy está correta"), você será levada a uma página que diz "Create New Environment for (Your Account Name) App" ("Criar um ambiente para a aplicação (sua conta)"). É aqui onde vamos configurar sua aplicação. Fique à vontade para explorar todas as opções nos menus, mas vamos usar as opções padrão por ora. Você não precisa escolher um domínio. 93 | * Clique no botão que diz "Create Environment" ("Criar ambiente"). 94 | 95 | #### Configuração de Ambiente 96 | 97 | Nesta página, vamos selecionar a configuração de homologação (staging). 98 | * Clique em "Boot This Configuration" ("Inicie esta configuração"). Você será levada a uma nova página onde verá várias barras de progresso se movendo. Nossa plataforma estará provisionando suas instâncias. Nós precisamos esperar até que tudo vire pontinhos verdes. Isso normalmente leva uns 10 minutos, então, alguém precisa fazer um intervalo? É uma boa hora para um café ou água. 99 | 100 | __TREINADORA__: Fale sobre homologação (staging) vs. produção (production), e porque é importante ter réplicas. Fale sobre principal (master) e secundário (slave). Como o Failover da Engine Yard funciona? Por que isso é importante? 101 | 102 | 103 | #### Colocando sua aplicação no ar 104 | 105 | 1. Assim que todos os pontinhos estiverem verdes, clique em "Deploy". 106 | 2. Assim que ver a frase "SEU NOME successfully deployed HEAD" ("SEU NOME fez o deploy de HEAD"), você saberá que seu código está no ar! Parabéns! 107 | 3. Clique no link que diz "View your application" ("Visualize sua aplicação") para visitar sua aplicação; 108 | 4. Se você receber uma notificação vermelha que diz que seu deploy falhou, nós só teremos alguma depuração a fazer. Levante a mão e uma treinadora te ajudará com isso. 109 | 110 | 111 | #### Parando suas instâncias para economizar suas horas de teste grátis 112 | 113 | Assim que você tiver sua aplicação rodando, certifique-se de clicar no botão "stop" ("parar") para parar suas instâncias, assim você não usa suas horas em vão. Você sempre pode reiniciá-las. 114 | 115 | ### Recursos adicionais 116 | * [Um tutorial em vídeo (em inglês)](https://support.cloud.engineyard.com/entries/21009937-Video-Tutorial-Set-up-an-Account-and-Deploy-an-Application) 117 | 118 | * [Outro tutorial do site da Engine Yard (em inglês)](https://support.cloud.engineyard.com/entries/20996751-Tutorial-How-to-Deploy-the-ToDo-Application-on-a-Trial-Account) 119 | 120 | {% include other-guides.md page="engineyard" %} 121 | -------------------------------------------------------------------------------- /_posts/2013-07-23-bundlerfordevelopment.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Bundler para Desenvolvimento 4 | permalink: bundlerfordevelopment 5 | --- 6 | 7 | *Traduzido por Roberta Schmitz Mayer, [@robsmayer](https://github.com/robsmayer)* 8 | 9 | 10 | # Como configurar o _Bundler_ para Desenvolvimento 11 | 12 | 1. Fork do _Bundler_ 13 | 14 | Vá para o Github do _Bundler_ [https://github.com/bundler/bundler](https://github.com/bundler/bundler) 15 | 16 | Clique no botão Fork. 17 | 18 | Fork _Bundler_ para que possa criar _pull requests_ com suas mudanças 19 | 22 | 23 | ![exibe botão Fork na interface do Github](../images/fork1.jpg) 24 | 25 | 29 |  2. Faça Download de uma cópia do seu fork do _Bundler_ 30 | 31 | {% highlight sh %} 32 | $ git clone https://github.com/user_name/bundler.git 33 | {% endhighlight %} 34 | 35 |  3. Mude para o diretório do _Bundler_ 36 | 37 | {% highlight sh %} 38 | $ cd bundler 39 | {% endhighlight %} 40 | 41 |  4. Configure o remote 42 | 43 | {% highlight sh %} 44 | $ git remote add upstream https://github.com/bundler/bundler.git 45 | {% endhighlight %} 46 | 47 | Isto conecta seu repositório local com o repósitorio __upstream__ no Github. 48 | 49 |  5. Instale as dependências de desenvolvimento do _Bundler_ 50 | 51 | {% highlight sh %} 52 | $ rake spec:deps 53 | {% endhighlight %} 54 | 55 | O que é rake? [http://rake.rubyforge.org/](http://rake.rubyforge.org/) 56 | 57 |  6. Rode o teste de validação do _Bundler_ 58 | 59 | {% highlight sh %} 60 | $ rake spec 61 | {% endhighlight %} 62 | 63 | Isto deve demorar uns 15 minutos. 64 | 65 | {% include other-guides.md page="bundlerfordevelopment" %} 66 | -------------------------------------------------------------------------------- /_posts/2013-07-25-videos.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Rails Girls em vídeos 4 | permalink: videos 5 | --- 6 | 7 | # Rails Girls é felicidade no mundo inteiro 8 | 9 | *Traduzido por Maujor, [site do Maujor](http://www.maujor.com)* 10 | 11 | Aqui você encontra uma seleção de vídeos da Rails Girls produzidos no mundo todo. Você tem um vídeo para compartilhar? Publique ele aqui. 12 | 13 | ### Rails Girls em Ljubljana 2014 14 | 15 |

Rails Girls Ljubljana - maio 2014 publicado por Nais Nouk no Vimeo.

16 | 17 | ### Rails Girls #2 em Taipei 11/2013 18 | 19 |

Rails Girls Taiwan publicado no Youtube.

20 | 21 | ### Rails Girls #1 Taipei 09/2013 22 | 23 |

Rails Girls Taiwan publicado no Youtube.

24 | 25 | ### Rails Girls Brno 2013 26 | 27 |

Rails Girls Brno publicado por Rails Girls CZ no Vimeo.

28 | 29 | ### Rails Girls Summer of Code 2013 30 | 31 |

Rails Girls Summer of Code publicado por Alexander Lang no Vimeo.

32 | 33 | ### Rails Girls Helsinki 2010 34 | 35 |

Rails for Girls publicado por Kisko Labs no Vimeo.

36 | 37 | ### Rails Girls Beograd 2013 38 | 39 |

Rails Girls Beograd from Nemanja Stojanović on Vimeo.

40 | 41 | ### Rails Girls Rheinland 2013 42 | 43 |

Rails Girls Rheinland - March 1 + 2 from Liane Thönnes on Vimeo.

44 | 45 | ### Rails Girls Maribor 2013 46 | 47 |

Rails Girls Maribor from Gretzki on Vimeo.

48 | 49 | ### Rails Girls Sofia 2013 50 | 51 |

Rails Girls Sofia - May 2013 publicado por Dimitar Dimitrov no Vimeo.

52 | 53 | ### Rails Girls Ljubljana 2013 54 | 55 |
56 | 57 | ### Rails Girls Warsaw 2012 58 | 59 |

Rails Girls Warsaw 2012 publicado por Terczer no Vimeo.

60 | 61 | ### Rails Girls Berlin 2012 62 | 63 |

Rails Girls Berlin 2012 from Alexander Lang on Vimeo.

64 | 65 | ### Rails Girls Zurich 2012 66 | 67 |

Rails Girls Zurich publicado por Daniel Puglisi no Vimeo.

68 | 69 | ### Rails Girls Cologne 2012 70 | 71 |

Rails Girls Cologne - setembro 2012 publicado por Liane Thönnes no Vimeo.

72 | 73 | 74 | ### Rails Girls Ljubljana 2012 75 | 76 |
77 |

Confira as novidadas do Rails Girls Ljubljana no FaceBook (na Eslovênia)

78 | -------------------------------------------------------------------------------- /_posts/2013-10-16-remote-pairing-for-the-win.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Para a vitória com o compartilhamento remoto! 4 | permalink: remote 5 | --- 6 | 7 | # Tutorial Rails Girls sobre compartilhamento remoto 8 | 9 | *Created by Ed Drain, [@SoldierCoder](https://twitter.com/soldiercoder)* 10 | Traduzido por Bomfim Jr, @bomfimjr_ 11 | 12 | ## Por que compartilhamento remoto é tão formidável? 13 | 14 | Primeiro as primeiras coisas. O que me motivou a escrever este tutorial? Se você está lendo ié porque está consciente do poder do [Rails Girls](http://railsgirls.com). Mas, caso tenha dúvidas sobre este poder, vou lhe dar alguns fatos. Rails Girls é uma organização que intruduz as mulheres no desenvolvimento web com Ruby on Rails. Para muitas mulheres ao redor do mundo, isso é uma **poderosa experiência emocional** que mostra que elas podem criar algo novo para a web e que elas podem contar com a ajuda de outras mulheres que já se envolveram com a tecnologia. 15 | 16 | 17 | Eu disse "ao redor do mundo", não disse? Realmente, Rails Girls está em **todos os continentes** e em **mais de 130 cidades!** Eu sei que isso só se tornou realidade graças a generosidade do Ryan Bates ([@RBates](https://twitter.com/rbates)), eu mesmo tive a honra de distribuir cupons gratuitos do [Railscasts](railscasts.com), durante três meses para muitas destas cidades. Isso faz parte dos objetivos do Rails Girls -- proporcionar as mulheres de todo mundo, ainda que se encontrem em circunstâncias adversas, a possibilidade de estudar e com seu próprio esforço e dedicaçar alcançar o sucesso -- em um emprego bem remunerado e onde sejam **respeitadas por suas criações**. 18 | 19 | ## Mas, por que compartilhamento remoto é tão formidável? 20 | 21 | Compartilhamento remoto é tão formidável porque pessoas podem contar com ajuda de outras pessoas mais experientes sem nem menos estarem próximas a elas. Eu sei disso, porque como treinador do [Rails Girls Summer of Code](http://railsgirlssummerofcode.org), eu morava na Virginia e treinava times que moravam em Londres e na Pennsylvania. Se não existisse compartilhamento remoto eu teria que pegar um avião ou dirigir por doze horas apenas para mostrar como escrever um "hello, world!" em um exemplo de app! 22 | 23 | ## OK, Estou convencida! O que eu preciso para participar de um compartilhamento remoto? 24 | * Uma conexão com a internet. 25 | * Uma ou mais amigas programadoras dispostas a participar de um compartilhamento remoto com você 26 | * [Madeye](https://madeye.io) -- muito importante! Essa ferramenta vai possibilitar que você e suas amigas trabalhem no mesmo código e VEJAM o que a outra pessoa está alterando ASSIM QUE a alteração for feita! 27 | * Opcionalmente poderá usar uma conta Google Hangouts ou Skype ou qualquer outro programa para que você e suas amigas possam conversar entre si. 28 | 29 | 33 | ## Como instalar Madeye? 34 | 1. Instale [Node.js](http://howtonode.org/how-to-install-nodejs) 35 | 36 | 2. Se estiver usando Linux/MAC, abra o terminal e execute o comando: 37 | {% highlight sh %} 38 | curl https://madeye.io/install | sh 39 | {% endhighlight%} 40 | 41 | Se estiver usando Windows abra o prompt e digite o comando: 42 | {% highlight sh %} 43 | npm install -g madeye 44 | {% endhighlight%} 45 | 46 |  3. Pronto! Madeye está instalado! 47 | 48 |  4. A seguir, no terminal, vá ao diretório que você deseja compartilhar e digite `madeye`. 49 | 50 |  5. Madeye vai mostrar, no terminal, o URL para compartilhamento com as suas companheiras de equipe e todas podem abrir o endereço nos seus navegadores e começar a editar o código. 51 | 52 | Estando em modo de compartilhamento no navegador, você e seu treinador poderão ver no lado esquerdo da tela seus ícones em diretórios, sub-diretórios e arquivos. Navegando pelos arquivos você será capaz de visualizar o curso do seu treinador enquando ele edita os arquivos e vice-versa. É **muito** fácil! 53 | 54 | ## Alternativas para Madeye 55 | 56 | Eu, autor deste tutorial, acredito que Madeye é o melhor programa para compartilhar programação remota. Contudo, esse tutorial expressa minha opinião e é minha contribuição para você leitora e para suas possíveis companheiras de compartilhamento. Mas, indico um link onde você encontrará outras opções de softwares de compartilhamento: [PairProgramWith.Me](http://pairprogramwith.me). Espero que você possa encontrar um ótimo caminho para você e suas companheiras de programação em pares. 57 | 58 | ## Considerações finais 59 | A comunidade Ruby é um bom exemplo de pessoas que ajudam outras pessoas. Basta olhar para as pessoas laureadas todos os anos com o título de [Ruby Heros](http://rubyheroes.com/) para constatar esta afirmação. Quão grandioso e generoso seria o mundo, se todos nós compartilhassemos um pouco do nosso conhecimento com pessoas em busca de conhecimentos. Isto seria como estar em um mundo que refletisse a palavra mais comum, que provavelmente você ira ouvir nas reuniões locais Ruby/Rails: "MINSWAN" -- Matz é bom, então nós somos bons! Vamos começar a ser boms com os outros 60 | 61 | {% include other-guides.md page="remote" %} 62 | -------------------------------------------------------------------------------- /_posts/2013-12-18-add-gravatar.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Adicionando Gravatar para a aplicação 4 | permalink: gravatar 5 | --- 6 | 7 | # Adicionando Gravatar para a aplicação 8 | 9 | *Criado por Catherine Jones* 10 | *Traduzido por Anderson Fernandes, [@andersonfernandes](https://github.com/andersonfernandes)* 11 | 12 | Este tutorial assume que você já construiu uma aplicação do Rails Girls seguindo este [tutorial](http://guides.railsgirls.com/app) e adicionou autenticação usando o [Devise](http://guides.railsgirls.com/devise/). 13 | 14 | ### Importante 15 | 16 | Você precisa ter um endereço de e-mail cadastrado com o Gravatar para isso funcionar. Se ainda não tem, você pode ir em [gravatar.com](http://br.gravatar.com/). 17 | 18 | ## *1.* Adicione a gem Gravtastic 19 | 20 | Abra seu gemfile e abaixo da gem `devise` adicione 21 | 22 | {% highlight ruby %} 23 | gem 'gravtastic' 24 | {% endhighlight %} 25 | 26 | No terminal rode 27 | 28 | {% highlight sh %} 29 | bundle install 30 | {% endhighlight %} 31 | 32 | Isto irá instalar a gem gravtastic. Então lembre de reiniciar seu servidor do rails. 33 | 34 | ## *2.* Configurando o Gravatar na sua aplicação 35 | 36 | Abra `app/models/user.rb`, e adicione essas linhas 37 | 38 | {% highlight ruby %} 39 | include Gravtastic 40 | gravtastic 41 | {% endhighlight %} 42 | 43 | logo após a primeira linha. 44 | 45 | ## *3.* Configure o Gravatar 46 | 47 | Abra `app/views/layouts/application.html.erb` e na seção 48 | 49 | {% highlight erb %} 50 | <% if user_signed_in? %> 51 | {% endhighlight %} 52 | 53 | antes do 54 | 55 | {% highlight erb %} 56 | <% else %> 57 | {% endhighlight %} 58 | 59 | adicione 60 | 61 | {% highlight erb %} 62 | <%= image_tag current_user.gravatar_url, :class => "gravatar" %> 63 | {% endhighlight %} 64 | 65 | E coloque o código abaixo no final do arquivo `app/assets/stylesheets/application.css`: 66 | 67 | {% highlight css %} 68 | .gravatar { 69 | height: 30px; 70 | width: auto; 71 | } 72 | {% endhighlight %} 73 | 74 | Agora abra sua aplicação no navegador e faça login com um endereço de e-mail associado com um Gravatar. Você será capaz de ver seu Gravatar. 75 | 76 | {% include other-guides.md page="gravatar" %} 77 | -------------------------------------------------------------------------------- /_posts/2014-01-05-design-using-html-and-css-chinese.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: 使用HTML和CSS美化你的应用 4 | permalink: design-html-css-chinese 5 | --- 6 | 7 | 1.美化header样式 8 | 9 | + 打开文件 `app/assets/stylesheets/application.css` 并在最底端添加: 10 | 11 | ``` 12 | .navbar { 13 | min-height: 38px; 14 | background-color: #f55e55; 15 | } 16 | ``` 17 | 18 | 刷新页面,查看样式有什么变化。 此处解释什么是css选择器,学员可以尝试修改header的颜色,字体等。 简单的颜色选取参考网站: [http://color.uisdc.com/](http://color.uisdc.com/) 19 | 20 | **教练:**解释`display`的属性,什么是内联元素,什么是块级元素 21 | 22 | + 在文件底部加入下面的代码: 23 | 24 | ``` 25 | .navbar a.brand { font-size: 18px; } 26 | .navbar a.brand:hover { 27 | color: #fff; 28 | background-color: transparent; 29 | text-decoration: none; 30 | } 31 | ``` 32 | 33 | **教练:**解释css中链接的四种状态 34 | 35 | 36 | 2.美化表格样式 37 | 38 | + 对于表格,我们可以使用[Bootstrap](http://www.bootcss.com/)的表格样式。打开`app/views/ideas/index.html.erb`文件,找到: 39 | 40 | ``` 41 | 42 | ``` 43 | 44 | 将其改为 45 | 46 | ``` 47 |
48 | ``` 49 | 50 | + 修改图片大小,找到这段代码 51 | 52 | ``` 53 | <%= image_tag(idea.picture_url, :width => 600) if idea.picture.present? %> 54 | ``` 55 | 56 | 尝试修改width 57 | 58 | 59 | + 打开文件`app/assets/stylesheets/ideas.css.scss`,加入以下代码: 60 | 61 | ``` 62 | .container a:hover { 63 | color: #f55e55; 64 | text-decoration: none; 65 | background-color: rgba(255, 255, 255, 0); 66 | } 67 | ``` 68 | 69 | 70 | + 尝试为页面添加背景图片,使用`background-image`属性,背景纹理资源参考此网站[http://subtlepatterns.com/](http://subtlepatterns.com/) 71 | 72 | 73 | 3.footer样式调整 74 | 75 | + 打开文件 `app/assets/stylesheets/application.css` 并在最底端添加: 76 | 77 | ``` 78 | footer { 79 | background-color: #ebebeb; 80 | padding: 30px 0; 81 | } 82 | ``` 83 | 84 | 尝试在`footer`中加入更多内容,并调整位置 85 | 86 | 4.按钮样式 87 | 88 | + 打开[http://localhost:3000/ideas/new](http://localhost:3000/ideas/new)页面,可以看到页面上的`Create Idea`按钮。 89 | 90 | 在文件`app/assets/stylesheets/ideas.css.scss`最后加入 91 | 92 | ``` 93 | .container input[type="submit"] { 94 | height: 30px; 95 | font-size: 13px; 96 | background-color: #f55e55; 97 | border: none; 98 | color: #fff; 99 | } 100 | ``` 101 | 102 | **教练:**解释css中`border`的使用,学员可以尝试修改按钮样式,加圆角,阴影,颜色等。 103 | -------------------------------------------------------------------------------- /_posts/2014-01-05-design-using-html-and-css.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Adicione design à sua aplicação com HTML e CSS 4 | permalink: design-html-css 5 | --- 6 | 7 | # Adicione design à sua aplicação com HTML e CSS 8 | *Traduzido por [@MADPT](https://github.com/MADPT) aka [Miguel Ângelo](http://www.miguelangelo.io)* 9 | 10 | **Esse guia assume que você já construiu o app do Rails Girls** [**seguindo o tutorial de desenvolvimento do app**](/app). 11 | 12 | 1.Desenhe o cabeçalho 13 | 14 | + Coloque o seguinte código na parte inferior do arquivo `app/assets/stylesheets/application.css`: 15 | 16 | {% highlight css %} 17 | .navbar { 18 | min-height: 38px; 19 | background-color: #f55e55; 20 | } 21 | {% endhighlight %} 22 | 23 | Agora atualize a página e verifique as mudanças. Você pode tentar alterar a cor ou fonte do cabeçalho. Você pode verificar a referência de cor aqui [http://color.uisdc.com/](http://color.uisdc.com/). 24 | 25 | **Instrutor(a):** fale sobre a propriedade `display`, `inline` e `block`. 26 | 27 | + Em seguida, coloque estas linhas na parte inferior: 28 | 29 | {% highlight css %} 30 | .navbar a.brand { font-size: 18px; } 31 | .navbar a.brand:hover { 32 | color: #fff; 33 | background-color: transparent; 34 | text-decoration: none; 35 | } 36 | {% endhighlight %} 37 | 38 | **Instrutor(a):** explique os 4 estados de um link 39 | 40 | 41 | 2.Desenhe a tabela 42 | 43 | + Nós simplesmente usamos o Twitter [Bootstrap](http://getbootstrap.com/) para polir a nossa tabela. Encontre esta linha no arquivo `app/views/ideas/index.html.erb` e substitua: 44 | 45 | {% highlight html %} 46 |
47 | {% endhighlight %} 48 | 49 | com 50 | 51 | {% highlight html %} 52 |
` 53 | {% endhighlight %} 54 | 55 | + Modifique o tamanho da imagem usando as seguintes linhas 56 | 57 | {% highlight erb %} 58 | <%= image_tag(idea.picture_url, :width => 600) if idea.picture.present? %> 59 | {% endhighlight %} 60 | 61 | Tente mudar a largura e veja o que vai acontecer 62 | 63 | 64 | + Adicione as seguintes linhas à parte inferior do arquivo `app/assets/stylesheets/ideas.css.scss`: 65 | 66 | {% highlight css %} 67 | .container a:hover { 68 | color: #f55e55; 69 | text-decoration: none; 70 | background-color: rgba(255, 255, 255, 0); 71 | } 72 | {% endhighlight %} 73 | 74 | 75 | + Tente adicionar algum estilo ao fundo com a propriedade `background-image`, use como referência 76 | [http://subtlepatterns.com/](http://subtlepatterns.com/) para alguns padrões. 77 | 78 | 79 | 3.Adicione estilo ao rodapé 80 | 81 | + Adicione as linhas ao fundo do ficheiro `app/assets/stylesheets/application.css`: 82 | 83 | {% highlight css %} 84 | footer { 85 | background-color: #ebebeb; 86 | padding: 30px 0; 87 | } 88 | {% endhighlight %} 89 | 90 | Tente adicionar mais coisas em `footer`, depois ajuste sua posição. 91 | 92 | 4.Adicione estilo ao botão 93 | 94 | + Abra [http://localhost:3000/ideas/new](http://localhost:3000/ideas/new) e encontre o botão `Create Idea`. 95 | 96 |   Adicione estas linhas ao ficheiro `app/assets/stylesheets/ideas.css.scss` 97 | 98 | {% highlight css %} 99 | .container input[type="submit"] { 100 | height: 30px; 101 | font-size: 13px; 102 | background-color: #f55e55; 103 | border: none; 104 | color: #fff; 105 | } 106 | {% endhighlight %} 107 | 108 | **Instrutor(a)** explique como usar `border` em css, tente modificar o estilo do botão como em volta da esquina, adicione sombra ou cor, etc. 109 | 110 | {% include other-guides.md page="design-html-css" %} 111 | -------------------------------------------------------------------------------- /_posts/2014-01-30-anynines.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Rails Girls no anynines 4 | permalink: anynines 5 | --- 6 | 7 | # Coloque seu app online com anynines 8 | 9 | *Criado por Floor Drees, [@floordrees](https://twitter.com/floordrees)* 10 | 11 | *Traduzido por [Júlio Fortunato](https://github.com/JulioFortunato)* 12 | 13 | __INSTRUTOR(A)__: Fale sobre os benefícios de fazer o deploy para o anynines vs utilizar outros data centers. 14 | 15 | ### Pegue um pouco de anynines para você 16 | 17 | 1. [Crie uma conta do anynines](http://anynines.com/). 18 | 19 | 2. [Faça o download e instale a Interface de Linha de Comando](https://anynines.zendesk.com/entries/60241846-How-to-install-the-CLI-v6) para interagir com o anynines. 20 | 21 | 3. Agora selecione o endpoint da api do anynines como destino e autentique-se usando suas credenciais: 22 | 23 | {% highlight sh %} 24 | cf api https://api.de.a9s.eu 25 | cf login -u [seu@email] -p [suasenha] 26 | {% endhighlight %} 27 | 28 | Ou, se isso não funcionar para você, use: 29 | 30 | {% highlight sh %} 31 | cf login 32 | {% endhighlight %} 33 | 34 | ... que solicitará seu endereço de email e senha. 35 | 36 | Se perguntando o que `cf` significa? É um atalho para [Cloud Foundry](http://www.cloudfoundry.com/), um sistema que o anynines usa nos bastidores. 37 | 38 | ### Envie seu app online 39 | 40 | Vamos enviar o código-fonte da sua máquina local para o anynines: 41 | {% highlight sh %} 42 | $> cf push [nome-do-app-de-sua-escolha] 43 | {% endhighlight %} 44 | 45 | Isso falhará miseravelmente, já que a aplicação precisa de um banco de dados MySQL para iniciar. Então, vamos criar um! O comando abaixo vai criar um serviço do MySQL com o plano gratuito. Depois do nome do plano, você precisa especificar um nome para a instância do serviço. Esse nome será usado em comandos futuros para se referir a essa instância do serviço: 46 | 47 | {% highlight sh %} 48 | $> cf create-service mysql Pluto-free [nome-do-servico-de-sua-escolha] 49 | {% endhighlight %} 50 | 51 | (Sério, você pode usar qualquer nome. Faça valer a pena!) 52 | 53 | Em seguida, vinculamos a instância do serviço MySQL à aplicação, para conceder à aplicação acesso à instância do MySQL, digite: 54 | {% highlight sh %} 55 | $> cf bind-service [nome-do-app-que-você-escolheu-acima] [nome-do-serviço-que-você-escolheu-acima] 56 | {% endhighlight %} 57 | 58 | Por fim, temos que reiniciar a aplicação para garantir que o vínculo do serviço funcionou: 59 | {% highlight sh %} 60 | $> cf restart [nome-do-app-que-você-escolheu-acima] 61 | {% endhighlight %} 62 | 63 | Você verá isto: 64 | {% highlight sh %} 65 | Creating service postgresql-d2197... OK 66 | Binding postgresql-d2197 to railsgirls... OK 67 | {% endhighlight %} 68 | 69 | Terminando com... `Push successful! App 'railsgirls' available at railsgirls.de.a9sapp.eu`. Score! 70 | 71 | ### Controle de Versão 72 | 73 | Nós precisamos adicionar nosso novo código ao controle de versão. Você pode fazer isso executando o seguinte comando no terminal: 74 | 75 | {% highlight sh %} 76 | git status 77 | git add . 78 | git commit -m "add anynines deployment" 79 | {% endhighlight %} 80 | 81 | __INSTRUTOR(A)__: Este será um ótimo momento para falar sobre sistemas de controle de versão e git, se ainda não o fez. 82 | 83 | ### Ajuda 84 | 85 | Você pode checar todos os sub-comandos do cf disponíveis digitando `cf help`. 86 | No caso de seu terminal não ter todas as respostas, a equipe do anynines certamente terá. Apenas envie um email para eles em support@anynines.com. 87 | 88 | Bons deploys! 89 | 90 | {% include other-guides.md page="anynines" %} 91 | 92 | -------------------------------------------------------------------------------- /_posts/2014-01-30-continuous-codeship.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Deploy contínuo - muito menos complicado 4 | permalink: continuous 5 | --- 6 | 7 | # Deploy contínuo com _Codeship_ 8 | 9 | *Created by Floor Drees, [@floordrees](https://twitter.com/floordrees)* 10 | *Traduzido por Bárbara Barbosa [@bahbbc](https://twitter.com/bahbbc)* 11 | 12 | ### O que é esse tal de deploy contínuo? 13 | 14 | Deploy contínuo é parte de um 'movimento' de entrega contínua. A ideia por trás da entrega contínua é a automação do máximo possível do processo de entrega de software. 15 | 16 | Com um ambiente de deploy contínuo funcionando é possível implantar Deploys via Git (Deverá ser realizado o _commit_ de tudo antes de testar e tudo deve ser testado antes do deploy), tornando a colaboração mais fácil e o deploy mais rápido. Então você pode focar em fazer o seu aplicativo ainda mais legal! 17 | 18 | Existem algumas empresas muito legais velejando a onda do deploy contínuo, nesse guia nos iremos configurar um ambiente de deploy contínuo para um aplicativo Ruby on Rails do Github para o Heroku, usando o [_Codeship_](http://www.codeship.io). 19 | 20 | __INSTRUTOR(A)__: Falar sobre os benefícios do deploy contínuo. 21 | 22 | ### Conta no _Codeship_ 23 | 24 | Primeiramente, você vai precisar de [uma conta no _Codeship_](https://www._codeship_.io/). Inscreva-se no _Codeship_ com o Github. O _Codeship_ precisa de acesso aos seus repositórios do Github para aprontá-los, então tenha certeza de garantir o acesso. 25 | 26 | Voltando no _Codeship_, vamos criar o nosso primeiro projeto. O primeiro passo para isso é selecionar o Github como o seu providor de repositório. Na lista dos seus repositórios do Github, busque o repositório que você quer configurar e selecione-o. No nosso caso, é o que está escrito algo tipo "railsgirls". 27 | 28 | Agora o seu repositório está conectado e você pode configurar os seus comandos de teste. Nós criamos uma aplicação Ruby on Rails. Então selecione "Ruby on Rails" como o framework que usaremos. Isso configura os comandos de inicialização e os comandos de testes para você. Deletando a cerquilha (`#`) você pode descomentar os comandos de teste que você quiser usar para a sua aplicação. Por enquanto você não deve ter testes para configurar ainda, então você pode pular esse passo e voltar a ver isso depois. 29 | 30 | Agora vamos finalizar a configuração e ir para o painel de controle. Você pode ativar o chamado 'novo _build_' (new _build_) para a sua aplicação mudando alguma coisa e dando _push_ no seu repositório: 31 | 32 | {% highlight sh %} 33 | git add . 34 | git commit -m "teste integracao Codeship" 35 | git push origin master 36 | {% endhighlight %} 37 | 38 | Você pode acessar os detalhes da construção do app (_build_) clicando na seta da direita. Aqui você pode acompanhar o _build_ enquanto ele ainda está rodando. Melhor que Big Brother - eu prometo. 39 | 40 | ... e alguns segundos depois o seu _build_ está completo! Você pode ver todos os comandos que rodaram. Depois de alguns comandos iniciais de preparação o _Codeship_ roda os comandos os comandos que você especificou há alguns momentos atrás. Você pode ver a saída de um único comando clicando nele. 41 | 42 | Você já mandou um _push_ no seu repositório, viu o log do seu _build_ e recebeu um _build_ verde. Então você pode finalizar o assistente no começo clicando no botão "Clique para finalizar" ("click to finish"). 43 | 44 | ### Configurando o deploy contínuo 45 | 46 | Agora vamos fazer o deploy da nossa aplicação no Heroku. Vá para a configuração do seu projeto no ícone de configuração no menu do _Codeship_. Então navegue até a seção "Deployment". Como você quer fazer deploy no Heroku, clique no botão "Heroku". 47 | 48 | Você precisará colocar o nome da sua aplicação no Heroku e a sua chave da API. Espero que você a tenha escrito em algum lugar! Coloque o nome da sua aplicação e a sua chave da API (para recuperar a sua chave da API, vá para a sua conta no Heroku e clique _"Show API key"_) e save a sua configuração de deploy. 49 | 50 | De agora em diante o _Codeship_ irá fazer deploy automática do seu aplicativo no Heroku, toda vez que você fizer um _push_ no seu repositório do Github. Da hora! 51 | 52 | ### Faça um teste 53 | Agora vamos fazer um _push_ com uma mudança e ver o que foi para deploy. Mude alguma coisa na sua aplicação primeiro, e depois faça um _commit_ e um _push_ com a mudança. 54 | 55 | {% highlight sh %} 56 | git add . 57 | git commit -m "isso muda tudo" 58 | git push 59 | {% endhighlight %} 60 | 61 | E imediatamente outro _build_ começará a rodar no _Codeship_. Volte ao seu projeto e você verá os comandos que nós já conhecemos do seu primeiro _build_. Bônus: A sua aplicação vai subir no Heroku e deve estar online depois de um minuto ou dois. 62 | 63 | {% include other-guides.md page="continuous" %} 64 | -------------------------------------------------------------------------------- /_posts/2014-01-30-ruby-game.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Crie um jogo simples com Ruby! 4 | permalink: ruby-game 5 | --- 6 | 7 | # Crie um jogo simples com Ruby! 8 | 9 | *Criado por Patrick Huesler, [@phuesler](https://twitter.com/phuesler) & Floor Drees, [@floordrees](https://twitter.com/floordrees) para o [Rails Girls The Hague](http://railsgirls.com/thehague)* 10 | *Traduzido por Daniel Barreto, [@danielfsbarreto](https://github.com/danielfsbarreto)* 11 | 12 | [gosu](http://www.libgosu.org/) é uma biblioteca de desenvolvimento de jogos 2D. Gosu provê interfaces amigáveis e fáceis de usar para jogos com gráficos 2D e texto (acelerado por hardware 3D), amostras de áudio e música, bem como suporte a entrada de comandos através de teclado, mouse e gamepad/joystick. Também inclui demos para integração com RMagick, Chipmunk e OpenGL. 13 | 14 | Seus códigos-fonte, wiki, rastreadores de defeitos, etc. estão todos [disponíveis no GitHub](http://github.com/jlnr/gosu/). O melhor ponto de entrada para a documentação do Gosu é a [página principal da wiki](http://github.com/jlnr/gosu/wiki). 15 | Instale: 16 | {% highlight sh %} 17 | gem install gosu 18 | {% endhighlight %} 19 | 20 | ou adicione `gem "gosu", "~> 0.7.48"` ao seu Gemfile e execute `bundle`. 21 | Brinque com os jogos de exemplo: 22 | {% highlight sh %} 23 | cd $GEM_HOME/gems/gosu-0.7.48/examples 24 | {% endhighlight %} 25 | 26 | e então: `ruby CptnRuby.rb` 27 | 28 | ou: `ruby RMagickIntegration.rb` 29 | 30 | ou: `ruby Tutorial.rb` 31 | 32 | ### Já tive o suficiente desses exemplos! 33 | 34 | Copie o repositório através de uma nova aba do seu terminal. Se você esteve trabalhando no aplicativo do Rails Girls nesse meio tempo, tenha certeza que você está no seu diretório home rodando `cd`. 35 | 36 | Agora execute 37 | {% highlight sh %} 38 | git clone https://github.com/FloorD/gosu_tutorial_RG_TH.git 39 | {% endhighlight %} 40 | 41 | e vá para o diretório apropriado através do comando 42 | {% highlight sh %} 43 | cd gosu_tutorial_RG_TH/jumpingem 44 | {% endhighlight %} 45 | 46 | ### Rode! 47 | 48 | Para jogar nosso joguinho, abra-o usando o terminal: 49 | {% highlight sh %} 50 | ruby game.rb 51 | {% endhighlight %} 52 | 53 | ### Então, como ele funciona? 54 | 55 | Que tal inspecionarmos um pouco de código? Abra `game.rb` no seu editor de texto. Consegue ver o trecho 56 | 57 | {% highlight ruby %} 58 | !/usr/bin/env ruby -w 59 | require 'rubygems' 60 | require 'gosu' 61 | include Gosu 62 | {% endhighlight %} 63 | 64 | ... logo no começo do arquivo? Aqui nós garantimos que 'chamamos' as gems necessárias, daí então podemos mover para nossa `class` (ou múltiplas classes). 65 | Mais adiante temos nossa 66 | 67 | {% highlight ruby %} 68 | class Game < Window 69 | end 70 | {% endhighlight %} 71 | 72 | ... rolando. Os `def`'s que você vê dentro da classe Game são métodos. Neles nós **def**inimos quais instruções o programa deve seguir. Apenas dê uma olhada no seguinte trecho de código: 73 | {% highlight ruby %} 74 | def draw 75 | draw_quad 0, 400, Color::WHITE, 640, 400, Color::WHITE, 640, 500, Color::WHITE, 0, 500, Color::WHITE 76 | if @dir == :left then 77 | offs_x = -25 78 | factor = 1.0 79 | else 80 | offs_x = 25 81 | factor = -1.0 82 | end 83 | @cur_image.draw(@x + offs_x, @y - 49, 0, factor, 1.0) 84 | end 85 | {% endhighlight %} 86 | 87 | Quer brincar um pouco? Copie o conteúdo de `game.rb` em um novo arquivo `.rb`. Salve-o e nomeie-o como preferir. Agora tente mudar algumas coisas no jogo e rode-o no seu terminal para ver as mudanças na prática. 88 | 89 | Acha que tem mais habilidades gráficas que Patrick (você provavelmente tem)? Então você pode tentar criar um novo `sprites.png`! Não esqueça de chamá-lo aqui: 90 | 91 | {% highlight ruby %} 92 | def initialize 93 | super(640, 480, false) 94 | self.caption = "Jump 'n Run" 95 | @standing, @walk1, @walk2, @jump = *Image.load_tiles(self, "sprites.png", 100, 160, false) 96 | @x, @y = 400, 0 97 | @vy = 0 98 | @dir = :left 99 | @cur_image = @standing 100 | end 101 | {% endhighlight %} 102 | 103 | Está vendo o código `Game.new.show`? Ele cria uma nova instância do jogo. Ela não tem memória, então quando você ficar preso em um jogo, apenas comece um novo. Divirta-se! 104 | 105 | #### Créditos 106 | 107 | Os assets utilizados em vim adventures podem ser encontrados [aqui](http://www.lostgarden.com/2007/05/dancs-miraculously-flexible-game.html) 108 | 109 | Os sons utilizados você vai encontrar em [Matthew Klingensmith (www.matthewklingensmith.com)](http://opengameart.org/content/matts-creative-commons-music) 110 | 111 | {% include other-guides.md page="ruby-game" %} 112 | -------------------------------------------------------------------------------- /_posts/2014-01-30-testing.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Melhor você checar seu app, antes de quebrá-lo 4 | permalink: testing-rspec 5 | --- 6 | 7 | # Teste sua aplicação com RSpec 8 | 9 | *Criado por Clemens Helm, [@clemenshelm](https://twitter.com/clemenshelm) e Floor Drees, [@floordrees](https://twitter.com/floordrees)* 10 | 11 | *Traduzido por Marina Limeira, [@marinalimeira_](https://www.twitter.com/marinalimeira_)* 12 | 13 | *Atualizado por Ana Schwendler, [@anaschwendler](https://twitter.com/anaschwendler)* 14 | 15 | **Esse guia assume que você já criou a app RailsGirls como mostrado no** [**tutorial para criação da app Rails Girls**](/app). 16 | 17 | [RSpec](https://github.com/rspec/rspec-rails) é um framework para testes em Ruby, que descreve o comportamento da nossa aplicação em uma sintaxe que não se parece muito com Ruby. Ele irá mostrar o resultado dos testes no seu terminal, então você testará suas habilidades de leitura também. 18 | 19 | __INSTRUTOR(A)__: Fale sobre testes e Desenvolvimento Guiado por Comportamento (Behavior Driven Development). 20 | 21 | ## *1.* Adicione a gem RSpec 22 | 23 | Abra o seu `Gemfile` e adicione esta linha aos grupos`:development` e `:test`, acima da tag final: 24 | 25 | {% highlight ruby %} 26 | group :development, :test do 27 | ... 28 | gem 'rspec-rails', '~> 3.8' 29 | end 30 | {% endhighlight %} 31 | 32 | e rode 33 | 34 | {% highlight sh %} 35 | bundle install 36 | {% endhighlight %} 37 | 38 | para instalar a gem. 39 | 40 | Em seguida, rode o comando abaixo para gerar as pastas do rspec: 41 | 42 | {% highlight sh %} 43 | rails generate rspec:install 44 | {% endhighlight %} 45 | 46 | Isso adiciona os seguintes arquivos usados para configuração: 47 | 48 | - `.rspec` 49 | - `spec/spec_helper.rb` 50 | - `spec/rails_helper.rb` 51 | 52 | ## *2.* Crie seu primeiro teste! 53 | 54 | Rubystas frequentemente utilizam as palavras 'teste' e 'especificação' da mesma maneira, e é por isso que você irá armazenar seus testes no diretório 'specs'. 55 | Para fazer isso, execute os seguintes passos: 56 | 57 | Vamos criar um teste para o nosso modelo `idea`, para fazer isso de maneira elegante em Rails: 58 | 59 | * Crie uma pasta `models` na sua pasta `spec`, rodando no terminal: 60 | {% highlight sh %} 61 | mkdir spec/models 62 | {% endhighlight %} 63 | 64 | * Salve seu teste como `idea_spec.rb` (` _spec.rb`). 65 | 66 | Dentro desse novo arquivo, em nosso primeiro teste, queremos garantir que uma ideia tenha um nome. Para fazer isso, vamos descrever uma de nossas especificações: 67 | 68 | {% highlight ruby %} 69 | require "rails_helper" 70 | 71 | RSpec.describe Idea, type: :model do 72 | it "tem um nome" do 73 | skip 74 | end 75 | end 76 | {% endhighlight %} 77 | 78 | No seu terminal rode: 79 | 80 | {% highlight sh %} 81 | rspec spec/models/idea_spec.rb 82 | {% endhighlight %} 83 | 84 | qual será o resultado que seu teste está pendente, pois ainda não está implementado. 85 | 86 | __INSTRUTOR(A)__: Fale sobre 'googlear' a saída do terminal 87 | 88 | Vamos fazer algo sobre isso! 89 | 90 | {% highlight ruby %} 91 | require "rails_helper" 92 | 93 | RSpec.describe Idea, type: :model do 94 | it "tem um nome" do # sim, você pode user 'it' (lê-se como 'isso tem um nome') 95 | idea = Idea.create!(name: "Minha ideia maravilhosa") # criando uma nova ideia 96 | expect(idea.name).to eq("Minha ideia maravilhosa") # esperamos que seja salvo com o nome correto 97 | end 98 | end 99 | {% endhighlight %} 100 | 101 | deve gerar uma saída mais adequada. 102 | 103 | ## *3.* Refatorando 104 | 105 | Você pode criar duas ideias, para ter certeza de que nosso projeto está criando ideias da maneira certa: 106 | 107 | {% highlight ruby %} 108 | require "rails_helper" 109 | 110 | RSpec.describe Idea, type: :model do 111 | it "tem um nome" do # sim, você pode user 'it' (lê-se como 'isso tem um nome') 112 | idea = Idea.create!(name: "Minha ideia maravilhosa") # sim, você pode user 'it' (lê-se como 'isso tem um nome') 113 | second_idea = Idea.create!(name: "Minha segunda ideia maravilhosa") # criando uma nova ideia 114 | expect(second_idea.name).to eq("Minha segunda ideia maravilhosa") # esperamos que a segunda ideia seja salva corretamente 115 | end 116 | end 117 | {% endhighlight %} 118 | 119 | que testa mais coisas. 120 | 121 | __INSTRUTOR(A)__: Fale um pouco sobre a refatoração. 122 | 123 | ## *4.* Marcando os testes como a fazer 124 | 125 | Sim! Listas de coisas a fazer. Maravilhoso. 126 | Uma boa funcionalidade do RSpec é a possibilidade de marcar alguns testes como pendente. Em outras palavras, primeiro você pensa sobre o que a implementação deve realizar, em seguida, escreve um teste para verificar se está funcionando. 127 | 128 | Vamos criar nosso próximo teste, adicionando as linhas abaixo ao nosso `idea_spec.rb` 129 | 130 | {% highlight ruby %} 131 | it "tem uma descricao" 132 | {% endhighlight %} 133 | 134 | retornará que o teste está pendente. 135 | 136 | Você consegue completar este teste? Você consegue pensar em outros testes? 137 | 138 | ## *5.* Desenvolvimento Guiado por Comportamento (BDD) 139 | 140 | __INSTRUTOR(A)__: Fale um pouco sobre Desenvolvimento Guiado por Comportamento (BDD). 141 | 142 | Agora você pode criar mais testes sozinho. 143 | Sinta-se à vontade para falar com o seu instrutor(a) para fazer isso ou maneiras de criar mais testes. 144 | 145 | Feliz testes! 146 | 147 | {% include other-guides.md page="testing-rspec" %} 148 | -------------------------------------------------------------------------------- /_posts/2014-01-30-trucker.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Rails Girls on Trucker 4 | permalink: trucker 5 | --- 6 | 7 | # Publique sua aplicação com Trucker.io 8 | 9 | *Created by Floor Drees, [@floordrees](https://twitter.com/floordrees) for [Rails Girls Leiden](http://railsgirls.com/leiden)* 10 | 11 | ### Instale o Trucker 12 | 13 | Siga os passos 1 a 3 do [Getting Started guide](http://developers.trucker.io/Getting-Started) para criar uma conta, instalar a ferramenta de linha de comando e login. 14 | 15 | Para instalar o `trucker-cli` (linha de comandos da ferramenta), execute: 16 | {% highlight sh %} 17 | $ gem install trucker-cli 18 | {% endhighlight %} 19 | 20 | #### Fazendo login no Trucker 21 | 22 | Você pode criar e gerenciar aplicativos usando o painel de controle do Trucker. No entanto, você também precisará fazer login usando o cliente de linha de comando. 23 | 24 | {% highlight sh %} 25 | $ truck target https://api.ie.trucker.io 26 | Setting target to https://api.ie.trucker.io... OK 27 | 28 | $ truck login 29 | email> 30 | password> 31 | {% endhighlight %} 32 | 33 | Neste ponto, o cliente Trucker vai exigir que você escolha um espaço para trabalhar. Os espaços são ambientes cuja finalidade é organizar as suas aplicações baseadas em seu estágio do ciclo de vida. A sua conta Trucker vem equipada com os seguintes espaços: 34 | 35 | {% highlight sh %} 36 | 1: development 37 | 2: production 38 | 3: staging 39 | Space> 40 | {% endhighlight %} 41 | 42 | __INSTRUTOR(A)__: Fale sobre os benefícios da implantação de Trucker.io (e ter datacenters na Europa, em vez de os EUA). 43 | 44 | ### Controle de Versão 45 | 46 | Nós precisamos adicionar em nosso código o controle de versão. Você pode fazer isso executando os seguintes comandos no terminal: 47 | 48 | {% highlight sh %} 49 | git init 50 | git add . 51 | git commit -m "initial commit" 52 | {% endhighlight %} 53 | 54 | __INSTRUTOR(A)__: Este seria um grande momento para falar sobre os sistemas de controle de versão e git. 55 | 56 | ### Publicando sua aplicação para o Trucker 57 | 58 | #### Fazendo pushing de sua aplicação para o Trucker.io 59 | 60 | Primeiro vamos executar o comando `push` e depois digite o nome que você quer que sua aplicação tenha (nós usaremos `railsgirls`). 61 | {% highlight sh %} 62 | $ truck push 63 | Name> railsgirls 64 | {% endhighlight %} 65 | 66 | 67 | {% highlight sh %} 68 | Instances> 1 69 | 70 | 1: 128M 71 | 2: 256M 72 | 3: 512M 73 | 4: 1G 74 | Memory Limit> 256M 75 | 76 | Creating railsgirls... OK 77 | 78 | 1: railsgirls 79 | 2: none 80 | Subdomain> railsgirls 81 | 82 | 1: ie.trucker.io 83 | 2: none 84 | Domain> ie.trucker.io 85 | 86 | Creating route railsgirls.ie.trucker.io... OK 87 | Binding railsgirls.trucker.io to railsgirls... OK 88 | {% endhighlight %} 89 | 90 | Em seguida, adicione o MySQL como seu banco de dados: 91 | 92 | {% highlight sh %} 93 | Create services for application?> y 94 | 95 | 1: rds-mysql n/a, via aws 96 | 2: redis 2.6 97 | 3: user-provided , via 98 | What kind?> 1 99 | 100 | Name?> rds-mysql-aa0d6 101 | 102 | 1: 100mb: Shared service, 100MB storage, 10 connections 103 | Which plan?> 1 104 | 105 | Creating service rds-mysql-aa0d6... OK 106 | Binding rds-mysql-aa0d6 to trucker-rails... OK 107 | {% endhighlight %} 108 | 109 | __INSTRUTOR(A)__: Fale sobre MySQL. 110 | 111 | 112 | Nós não queremos adicionar outros serviços, você pode responder às seguintes perguntas com `n`: 113 | {% highlight sh %} 114 | Create another service?> n 115 | 116 | Bind other services to application?> n 117 | {% endhighlight %} 118 | 119 | Depois salve sua aplicação 120 | {% highlight sh %} 121 | Save configuration?> y 122 | 123 | Saving to manifest.yml... OK 124 | Uploading trucker-rails 125 | {% endhighlight %} 126 | 127 | e seu aplicativo estará publicado. A saída no seu terminal deve ser algo como isto: 128 | 129 | {% highlight sh %} 130 | Uploading railsgirls... OK 131 | Preparing to start railsgirls... OK 132 | -----> Downloaded app package (40K) 133 | -----> Using Ruby version: ruby-1.9.3 134 | -----> Installing dependencies using Bundler version 1.3.2 135 | (...) 136 | Checking status of app 'railsgirls'... 137 | 1 of 1 instances running (1 running) 138 | Push successful! App 'railsgirls' available at http://railsgirls.ie.trucker.io 139 | {% endhighlight %} 140 | 141 | Sua aplicação agora está disponível em http://railsgirls.ie.trucker.io! 142 | 143 | {% include other-guides.md page="trucker" %} 144 | -------------------------------------------------------------------------------- /_posts/2014-03-24-alternative-dev-environment.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Ambiente de desenvolvimento alternativo usando VirtualBox 4 | permalink: virtual-machine 5 | --- 6 | 7 | # Introdução 8 | 9 | Um ambiente de desenvolvimento é a soma de todas as aplicações e ferramentas, com as quais uma desenvolvedora pode trabalhar diariamente. Além de um navegador e de um editor de código, todos os programas necessários para rodar e servir nossa aplicação estão incluídos no ambiente. Para desenvolvimento em Ruby on Rails, certamente precisaremos de Ruby e do framework Rails, além de um banco de dados, um servidor para aplicações web, etc. 10 | Uma desenvolvedora experiente, por padrão, instalaria todas essas ferramentas em seu ambiente, mas isso é uma tarefa avançada. Além disso, se vocês estão trabalhando em sistemas operacionais diferentes, a maioria de vocês está trabalhando no Windows, onde instalar um ambiente adequado de desenvolvimento com Ruby é um problema enorme. 11 | 12 | Considerando tudo o que falamos acima, criamos um ambiente de desenvolvimento virtual para o primeiro evento Rails Girls - Budapeste, com a esperança de que poderíamos facilitar a experiência de cada participante. 13 | 14 | 15 | 16 | ## Máquina Virtual 17 | 18 | Uma [máquina virtual (VM)](http://en.wikipedia.org/wiki/Virtual_machine) é uma emulação de um computador, baseada em software. 19 | 20 | ### Limitações 21 | 22 | Para virtualizar um sistema operacional diferente, seu computador precisará usar uma certa quantidade de capacidade de energia e memória. Não recomendamos a virtualização se o seu computador não tem mais do que um núcleo de CPU, e pelo menos 2GB de memória RAM. 23 | 24 | # Instalando o ambiente de desenvolvimento 25 | 26 | ## Ambiente virtual 27 | 28 | Criamos uma máquina virtual para você, com todos os programas e ferramentos necessários pré-instalados. Para aquelas que estiverem interessadas nos parâmetros: trata-se de uma máquina 32 bits rodando Ubuntu 12.04, sem nenhum gerenciador de janelas (você não precisa disso agora). Com essa solução, todas serão capazes de escrever o código necessário em seu ambiente normal, é possível usar seu navegador favorito, e a máquina virtual só será necessária quando você quiser rodar comandos Rails no terminal. Você poderá fazer isso no navegador também, como você verá mais adiante. 29 | 30 | ### VirtualBox 31 | 32 | VirtualBox é a plataforma de virtualização da Oracle, que pode ser baixada em todos os sistemas operacionais suportados (Windows, macOS, Linux). Vamos baixar o instalador a partir do endereço [https://www.virtualbox.org/wiki/Downloads](https://www.virtualbox.org/wiki/Downloads), e vamos instalá-lo em seguida. 33 | 34 | ### Máquina virtual das Rails Girls 35 | 36 | Por favor baixe a máquina virtual criada para esse evento [aqui](http://www.digitalnatives.hu/demos/railsgirls/railsgirls_virtualbox_vm.zip). Após o download, por favor descompacte o arquivo, e coloque os conteúdos desse arquivo em uma pasta. 37 | Vamos abrir a VirtualBox que já foi instalada. Por favor encontre o comando Machine/Add (Máquina/Adicionar) no menu. 38 | Procure a pasta criada anteriormente, que contém nossa VM, e selecione o arquivo que tem a extensão *vbox*. 39 | Se você configurou tudo certinho, uma nova VM apareceu na barra à esquerda, com o nome *RailsGirls*. 40 | Podemos, então, iniciá-la pela primeira vez! 41 | 42 | ![VirtualBox / Iniciando a VM](/images/virtualbox.png) 43 | 44 | #### Iniciando 45 | 46 | Selecione a máquina virtual desejada e pressione o botão *start* (iniciar)! Se tudo estiver certo, uma janela preta deve aparecer, na qual, após 10-60 segundos, o rótulo `precise32 login:` aparecerá. Isso significa que a nossa VM está ligada e rodando! Não vamos precisar dessa janela depois, mas não feche-a, porque ela deve continuar sendo executada enquanto estivermos codando. 47 | 48 | #### Desligando 49 | 50 | Quando você não precisa mais de uma VM, você pode desligá-la. Para isso, feche a janela descrita acima, e selecione *Shut down* (desligar) das opções disponíveis. Depois que ela desligar, a VM não usará mais nenhum recurso do seu computador além de algum espaço no disco. 51 | 52 | #### O mouse invisível 53 | 54 | Ao clicarmos nessa janela da VirtualBox, ela pega nosso ponteiro do mouse, e ele desaparece sem deixar vestígios. Você pode recuperar seu ponteiro: no canto inferior direito da janela você consegue ver a combinação de teclas que você tem que pressionar (no macOS é esquerda-cmd, e em outras plataformas é direita-ctrl). 55 | 56 | ### Uso 57 | 58 | Agora que nossa VM está ligada e rodando, vamos fazer login nela. Podemos logar a partir da janela de VirtualBox descrita acima, mas isso não é muito confortável de fazer (já que essa janela não está reconhecendo nosso layout de teclado e nenhum atalho como copiar-colar vai funcionar, etc.). Também poderíamos logar remotamente (com uma conexão SSH), mas o Windows não tem um cliente de SSH pré-instalado, e instalar um seria muito trabalhoso. 59 | Por causa disso, você pode logar na sua VM usando um navegador. Abra seu navegador favorito (Chrome :) ), e digite o endereço [http://localhost:57575](http://localhost:57575). 60 | Se tudo estiver certo, devemos ver uma borboleta: 61 | 62 | ![Borboleta / Terminal no seu navegador](/images/butterfly_login.png) 63 | 64 | Nós vamos nos referir a essa aba do seu navegador como um terminal, e você deverá digitar todos os comandos destinados ao Rail aqui. 65 | 66 | #### Colando texto 67 | 68 | No Linux e no Windows, você não conseguirá colar qualquer código copiado com a combinação normal de Ctrl+V. Em vez disso, por favor use shift-inserir, porque deve funcionar. 69 | 70 | ### Login 71 | 72 | Vamos logar na nossa VM com as seguintes credenciais (por favor ESTEJA CIENTE de que você não verá nada mudar enquanto estiver digitando a senha, e que isso é totalmente normal): 73 | 74 | {% highlight sh %} 75 | login: vagrant 76 | password: vagrant 77 | {% endhighlight %} 78 | 79 | Após ter feito login com sucesso, você deve ver o seguinte rótulo: 80 | 81 | {% highlight sh %} 82 | vagrant@precise32:~$ 83 | {% endhighlight %} 84 | 85 | IMPORTANTE: sempre que estivermos logadas na VM, não se esqueça de digitar a seguinte linha em seguida: `/bin/bash --login`!!! 86 | 87 | ### Diretório compartilhado 88 | 89 | A parte mais difícil já acabou, e nosso ambiente de desenvolvimento está quase pronto. Só falta uma coisa: temos que compartilhar uma pasta, que deve ser lida pelo nosso sistema operacional normal e pela nossa VM, já que vamos escrever código na primeira, mas vamos ler o código na última. 90 | 91 | Vamos criar uma nova pasta chamada *railsgirls* na nossa máquina virtual (na nossa pasta inicial de usuário). 92 | Vamos desligar nossa VM, como descrito acima. Após o desligamento da máquina, selecione a VM no VirtualBox, e pressione *Settings*. Clique na aba Arquivos Compartilhados (Shared Folders), e clique no ícone de + pequeno, à direita. 93 | Na janelinha que aparecerá, procure pela pasta *railsgirls* como um caminho de pasta (Folder Path). Dê à pasta o nome (foldername) de *railsgirls*, e também selecione a opção *Auto Mount* (todas as outras opções devem estar não-selecionadas). 94 | Inicie a VM novamente, e faça login nela com o processo já conhecido: 95 | 96 | * abra [http://localhost:57575](http://localhost:57575) 97 | * faça log in com vagrant / vagrant 98 | * não se esqueça de executar `/bin/bash --login` 99 | 100 | #### Checagem de sistema 101 | 102 | A pasta compartilhada pode ser encontrada no caminho */media/sf_railsgirls*. Vamos verificar se tudo está funcionando conforme esperdo. Por favor entre no diretório: 103 | 104 | {% highlight sh %} 105 | $ cd /media/sf_railsgirls 106 | {% endhighlight %} 107 | 108 | Vamos criar um arquivo vazio: 109 | 110 | {% highlight sh %} 111 | $ touch teste.txt 112 | {% endhighlight %} 113 | 114 | Agora vamos checar, no nosso sistema operacional normal, se a pasta compartilhada contém um arquivo chamado *teste.txt*. Se o arquivo existir, isso significa que nosso ambiente de desenvolvimento virtual está pronto. 115 | 116 | ## Editor 117 | 118 | O editor de código é, na verdade, um editor de texto muito esperto, no qual vamos escrever todo o código da nossa aplicação. Nós gostamos muito do Sublime Text, que você pode baixar de [http://www.sublimetext.com/3](http://www.sublimetext.com/3). 119 | 120 | {% include other-guides.md page="virtual-machine" %} 121 | -------------------------------------------------------------------------------- /_posts/2014-05-10-sinatra-html.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Mostrando a lista de Café 4 | permalink: sinatra-html 5 | --- 6 | 7 | # Mostrando a lista de Café 8 | 9 | *Criado por Tim McEwan, [@tjmcewan](https://twitter.com/tjmcewan)* 10 | 11 | *Traduzido por Marina Limeira, [@marinalimeira_](http://twitter.com/marinalimeira_)* 12 | 13 | Utilizar `.inspect` funciona para depurar, mas nós não queremos utilizá-lo em produção. Por um motivo, é muito difícil estilizar a saída. Vamos colocar nossa lista de cafés dentro do HTML correto. 14 | 15 | ## 1. Configuração 16 | 17 | Primeiro vamos fazer um método que irá retornar nossos café dentro de tags HTML. Nós iremos nomear o método `coffees_html`, e o que ele faz é meio óbvio. Defina ele como: 18 | 19 | {% highlight ruby %} 20 | def coffees_html 21 | # construa o HTML aqui 22 | end 23 | {% endhighlight %} 24 | 25 | E no seu template altere a linha `#{ $coffees.inspect }` para chamar nosso novo método: 26 | 27 | {% highlight ruby %} 28 | #{ coffees_html } 29 | {% endhighlight %} 30 | 31 | ## 2. Adicione algum HTML 32 | 33 | Escreva alguma coisa para tornar a variável global `$coffees` em HTML que pareça assim: 34 | 35 | {% highlight HTML %} 36 |
Flat White $3.50
37 |
38 |
Cappuccino $2.50
39 | {% endhighlight %} 40 | 41 | **Dica:** Lembre-se, a variável `$coffees` é um array de hashes. 42 | 43 | Nós queremos iterar o array `$coffees` e transformar cada hash em uma string HTML, dentro de `
`s, que deveriam ser todos separados por `
`s. Nós também queremos ter certeza de estar retornando uma string. 44 | 45 | Para alguma ideias de solução, [cheque isto](http://tjmcewan.github.io/coffeecalc/snippets/coffees_html.rb.txt). 46 | 47 | {% include other-guides.md page="sinatra-html" %} 48 | -------------------------------------------------------------------------------- /_posts/2014-05-29-touristic-autism_basic-app.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: App para turismo de autismo amigável 4 | permalink: touristic-autism_basic-app 5 | --- 6 | 7 | # Aplicação Web Básica 8 | 9 | *Criado por Myriam Leggieri, [@iammyr](https://twitter.com/iammyr)* 10 | *para o projeto [Rails Girls Galway](https://github.com/RailsGirlsGalway)* 11 | 12 | *Traduzido por Luiz Santos, [@santosluiz](https://github.com/santosluiz)* 13 | 14 | Os tutoriais básicos que foram mesclados e adaptados são: [Tutorial Ruby on Rails](http://www.railstutorial.org/book), [App RailsGirls](http://guides.railsgirls.com/app/) e o tutorial para [criação de thumbnails](http://guides.railsgirls.com/thumbnails), [autenticando usuários](http://guides.railsgirls.com/devise/), [adicionando um design](http://guides.railsgirls.com/design), [implementando com o OpenShift](http://guides.railsgirls.com/openshift/) e [adicionando comentários](http://guides.railsgirls.com/commenting). 15 | 16 | ## Conheça as ferramentas 17 | 18 |
19 | 20 |

 

21 | 22 |

Editor de Texto

23 | 24 |

Sublime Text, Komodo Edit, Vim, Emacs, e Gedit são exemplos de editores de texto que você pode usar para codar e editar arquivos.

25 | 26 |

 

27 | 28 |

Terminal (conhecendo os comandos do Prompt no Windows)

29 | Onde você irá iniciar o servidor rails e rodar os comandos. 30 | 31 |

 

32 | 33 |

Navegadores - Browsers

34 | (Firefox, Safari, Chrome) para visualizar sua aplicação. 35 | 36 |

GitHub

37 | [Slides - por Kevin Lyda @]() 38 | 39 |
40 | 41 | ### Importante 42 | 43 | É importante que você selecione as instruções específicas do seu sistema operacional - os comandos que você roda no Windows são superficialmente diferentes dos comandos do Mac ou do Linux. Se você estiver tendo algum problema, verifique o comutador do sistema operacional no rodapé dos comandos. 44 | 45 | 46 | ## 1. Criando a aplicação 47 | 48 | Nós iremos criar um novo app Rails chamado *railsgirls-galway*. 49 | 50 | Primeiro, vamos abrir o terminal: 51 | 52 | * macOS: Abra o Spotlight, digite *Terminal* e clique em *Terminal*. 53 | * Windows: Clique no Menu Iniciar e digite *Prompt* e clique em *Command Prompt with Ruby and Rails*. 54 | * Linux (Ubuntu/Fedora): Procure por *Terminal* no dashboard e clique em *Terminal*. 55 | 56 | Próximo, digite estes comandos no terminal: 57 | 58 | 60 | {% highlight sh %} 61 | mkdir projetos 62 | {% endhighlight %} 63 | 64 | 66 | Você pode verificar o diretório `projetos` (que acabou de ser criado), utilizando o comando: `ls`. Se tudo ocorreu bem, você deverá ver o diretório `projetos` na listagem. Agora, devemos acessar o conteúdo do diretório `projetos` que acabamos de criar, utilizando o seguinte comando: 67 | 69 | 70 | {% highlight sh %} 71 | cd projetos 72 | {% endhighlight %} 73 | 74 | 76 | Você pode verificar se está em um diretório vazio utilizando o comando `ls`. Agora, você pode criar uma nova aplicação chamada `railsgirls-galway` com o comando: 77 | 79 | 80 | {% highlight sh %} 81 | rails new railsgirls-galway 82 | {% endhighlight %} 83 | 84 | 86 | Este comando irá criar uma nova aplicação na pasta `railsgirls`. Então, nós devemos sair do diretório atual para entrarmos no diretório principal da nossa aplicação. Podemos fazer isso com o seguinte código: 87 | 89 | 90 | {% highlight sh %} 91 | rvm rubygems latest 92 | cd railsgirls-galway 93 | {% endhighlight %} 94 | 95 | 97 | Se você digitar o comando `ls` dentro do diretório, você deverá ver as pastas `app` e `config`. Então, você pode iniciar o servidor Rails com o comando: 98 | 100 | 101 | {% highlight sh %} 102 | rails server 103 | {% endhighlight %} 104 | 105 | 106 | 109 | 110 | Acesse [http://localhost:3000](http://localhost:3000) no seu navegador. Deverá aparecer a página de boas-vindas: "Welcome aboard". Isso significa que a sua aplicação em Rails está funcionando perfeitamente. 111 | 112 | Perceba que nesta janela, o prompt de comando não está visível porque você está em um servidor Rails. O prompt de comando será mais ou menos assim: 113 | 114 |
115 |
116 | {% highlight sh %} 117 | $ 118 | {% endhighlight %} 119 |
120 |
121 | {% highlight sh %} 122 | > 123 | {% endhighlight %} 124 |
125 |
126 | 127 | Enquanto o prompt de comando não estiver visível, você não poderá executar novos comandos. Se você tentar inserir algum comando como `cd` ou algum outro comando, ele não irá funcionar. Para retornar ao prompt de comando normal: 128 | 129 | Pressione Ctrl+C no terminal para sair do servidor. 130 | 131 | **Instrutor(a):** Explique o que cada comando faz. 132 | [O que é um servidor e uma aplicação web - Slides por @]() 133 | O esqueleto gerado por `rails new` reflete o padrão de arquitetura [Model-View-Controller(MVC) - Slides por @](). 134 | 135 | {% include other-guides.md page="touristic-autism_basic-app" %} 136 | 137 | -------------------------------------------------------------------------------- /_posts/2014-05-29-touristic-autism_continuous-deployment.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: App para turismo de autismo amigável 4 | permalink: touristic-autism_continuous-deployment 5 | --- 6 | 7 | # Deploy Contínuo 8 | 9 | *Criado por Myriam Leggieri, [@iammyr](https://twitter.com/iammyr)* 10 | *para [Rails Girls Galway](https://github.com/RailsGirlsGalway)*. 11 | Os guias básicos que foram unidos e adaptados são o [Tutorial de Ruby on Rails](http://www.railstutorial.org/book), o [RailsGirls app básico](http://guides.railsgirls.com/app/) e os tutoriais para [criar thumbnails](http://guides.railsgirls.com/thumbnails), [autenticar usuários](http://guides.railsgirls.com/devise/), [adicionar design](http://guides.railsgirls.com/design), [deploy ao OpenShift](http://guides.railsgirls.com/openshift/) e [adicionar comentários](http://guides.railsgirls.com/commenting). 12 | Traduzido por Renan Muliterno, [rmuliterno](https://github.com/rmuliterno). 13 | 14 | 15 | 16 | Nós iremos realizar o deploy da nossa(ainda vazia) aplicação Rails, para produção. Realizar o deploy cedo e com frequência nos permite captar problemas de deploy no começo do nosso ciclo de desenvolvimento, caso contrário podemos ter problemas durante a fase de integração. 17 | Vários hosts compartilhados, servidores virtuais privados, empresas de deploy de serviços inteiros e serviços de deploy em nuvem, todos fornecem ferramentas que facilitam o deploy de aplicações Rails. 18 | 19 | OpenShift é um dos serviços de deploy em nuvem que oferecem tais ferramentas. É uma plataforma de computação em nuvem como um serviço (Paas) que facilita o deploy de aplicativos online. É de código aberto e escrito em Ruby. 20 | 21 | 22 | 23 | [Criar uma conta no OpenShift](https://openshift.redhat.com/app/account/new?web_user[promo_code]=railsgirls), nos permite colocar 3 aplicações online de graça. Após entrar com sua conta, instale o OpenShift RHC Client Tools (Ferramentas do Cliente RHC OpenShift) adicionando a gema rhc no ambiente de produção. Adicione o seguinte código para o arquivo Gemfiile (que é escrito em Ruby ndr): 24 | 25 |
26 | {% highlight ruby %} 27 | group :production do 28 | gem 'rhc' 29 | end 30 | {% endhighlight %} 31 |
32 | 33 | 34 | Se você não está usando o RVM ou o RailsInstaller então siga [esse guia](https://www.openshift.com/developers/rhc-client-tools-install) 35 | (você talvez precise executar o comando `sudo gem install rhc`). 36 | 37 | Então rode no terminal: 38 | 39 |
40 |
41 | {% highlight sh %} 42 | bundle install --without production 43 | rhc setup 44 | {% endhighlight %} 45 |
46 |
47 | A opção `--without production` previne a instalação local de alguma gema de produção. 48 | 49 | Se o Bundler mostrar algum erro na leitura, tente adicionar gem `rb-readline` para o seu Gemfile. 50 | 51 | Como as únicas gemas que nós adicionamos estão restritas à um ambiente de produção, no momento esse comando não instala nenhuma gema local adicional, mas esse comando é necessário para atualizar o arquivo `Gemfile.lock`. Agora, vamos realizar o commit dessas alterações ao GitHub! 52 | 53 | **Instrutor(a):** Explique os benefícios do deploy em um PaaS, como o OpenShift, ao invés de servidores tradicionais. O que "produção" quer dizer. Falar sobre SSH e por quê temos que subir uma chave pública para realizar comunicações com segurança. 54 | [Slides por Gerry Kavanagh @gerryk]() 55 | 56 | Navegue para a pasta `projects`. Rode no prompt: 57 | 58 |
59 |
60 | {% highlight sh %} 61 | rhc app create openshiftapp ruby-1.9 postgresql-9.2 --from-code=https://github.com/openshift/rails-example.git 62 | {% endhighlight %} 63 |
64 |
65 | 66 | Precisamos do diretório `.openshift` e do arquivo `config/database.yml` da aplicação de exemplo para o nosso app em Rails rodar no OpenShift. 67 | Copie isso do diretório `openshiftapp` para o diretório `railsgirls`. 68 | 69 |
70 |
71 | {% highlight sh %} 72 | cd railsgirls-galway-2014 73 | cp -r ../openshiftapp/.openshift . 74 | cp ../openshiftapp/config/database.yml config 75 | {% endhighlight %} 76 |
77 | Agora adicione e realize o commit dessas mudanças no Git! 78 |
79 | 80 | OpenShift usa o banco de dados PostgresSQL, o que significa que devemos adicionar a gema `pg` no ambiente de produção para permitir que o Rails se comunique com o Postgres. Note, também, a adição da gema `rails_12factor`, que é usada para servir recursos estáticos como imagens e folhas de estilo. 81 | Substitua `gem sqlite` no Gemfile com o seguinte código: 82 | 83 |
84 |
85 | {% highlight sh %} 86 | gem 'sqlite3', :group => [:development, :test] 87 | gem 'pg', :group => [:production] 88 | gem 'rails_12factor', :group => [:production] 89 | {% endhighlight %} 90 |
91 |
92 | Agora faça um bundle excluíndo as gemas em produção. 93 | 94 | Em algumas plataformas, isso pode gerar versões de plataformas específicas das suas Gems o que pode causar problemas quando você colocar seu app na nuvem. Para prevenir isso, abra o seu arquivo Gemfile.lock e cheque as versões das Gems `sqlite3` e `pg`. Se elas possuem um sufixo específico de plataforma como `-x86mingw32`, remova-os (por exemplo troque `pg (0.16.0-x86-mingw32)` para `pg (0.16.0)` e `sqlite3 (1.3.8-x86-mingw32)` para `sqlite3 (1.3.8)`). 95 | Salve e feche o arquivo, então rode o comando de bundle novamente antes de prosseguir. 96 | 97 | Adicione e realize o commit dessas mudanças no Git! 98 | 99 | **Instrutor(a):** Fale sobre banco de dados relacionais e as diferenças entre o SQLite e o PostgreSQL 100 | 101 | 102 | Agora estamos prontos para fazer o deploy do app Rails Girls para o OpenShift. Nós precisamos especificar para o nosso repositório Git aonde enviar o código. Para pegar a localização do seu repositório OpenShift, rode o seguinte comando e copie a URL do Git da resposta. 103 | 104 |
105 |
106 | {% highlight sh %} 107 | rhc app show openshiftapp 108 | {% endhighlight %} 109 |
110 |
111 | 112 | Agora rode os seguintes comandos, trocando a string SSH com o seu URL do Git. Estamos usando `-f` para forçar porque é bom limpar o histórico do atual repositório OpenShift, que contém o app Rails de exemplo. Ao enviar mudanças futuras, poderá apenas usar um `git push`. 113 | 114 |
115 |
116 | {% highlight sh %} 117 | git remote add openshift ssh://5387bff65973cadf3c000323@openshiftapp-railsgirlsgalway.rhcloud.com/~/git/openshiftapp.git/ 118 | git push -f --set-upstream openshift master 119 | {% endhighlight %} 120 |
121 |
122 | Reinicie o app no seu navegador para ver o resultado. 123 | Se o app falhar (500 Internal Server Error) ou, geralmente (error from the rhc tail openshiftapp : "Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`"). 124 | 125 | O seguinte vai resolver: 126 | Pegue um segredo com o `rake secret` e o designe para a variável de ambiente `SECRET_KEY_BASE` e exporte a variável para `~/.bash_profile`. 127 | O OpenShift (o Heroku também) precisa servir recursos estáticos como imagens e CSS: 128 | 129 |
130 |
131 | {% highlight sh %} 132 | $ rake assets:precompile 133 | $ git add . 134 | $ git commit -am "Add precompiled assets for OpenShift" 135 | git push -f --set-upstream openshift master 136 | {% endhighlight %} 137 |
138 | 139 |
140 | Apenas use isso se o OpenShift falhar. Iremos falar sobre `rake` e `assets` mais pra frente. 141 | 142 | Quando enviamos uma nova versão da aplicação, qualquer coisa armazenada na cópia do repositório OpenShift será limpada para liberar espaço para os novos arquivos. Isso inclui alguns arquivos de registros e imagens subidas por usuários. Para consertar isso, podemos armazenar esses arquivos em diretórios persistentes no OpenShift; o caminho das localizações que precisamos estão armazenadas em variáveis de ambiente. 143 | 144 | Para trocar a localização do registro de produção, abra `config/environments/production.rb`. Logo abaixo da linha de comentário: 145 | 146 |
147 |
148 | {% highlight sh %} 149 | config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) 150 | {% endhighlight %} 151 |
152 |
153 | 154 | Adicione a linha: 155 | 156 |
157 |
158 | {% highlight sh %} 159 | config.logger = ActiveSupport::Logger.new(File.join(ENV['OPENSHIFT_RUBY_LOG_DIR'], "production.log")) 160 | {% endhighlight %} 161 |
162 |
163 | 164 | Usuários do Rails 3: Trocar `ActiveSupport::Logger` por `ActiveSupport::BufferedLogger`. 165 | 166 | Você pode monitorar os registros de sua aplicação com o comando `rhc tail openshiftapp` (o retorno da mudança que você acabou de fazer não será exibido até que o novo arquivo seja commitado e enviado para o OpenShift). 167 | 168 | **Instrutor(a):** Discutir a importância de registros da aplicação. 169 | 170 | {% include other-guides.md page="touristic-autism_continuous-deployment" %} 171 | -------------------------------------------------------------------------------- /_posts/2014-05-29-touristic-autism_git.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: App para turismo de autismo amigável 4 | permalink: touristic-autism_git 5 | --- 6 | 7 | # Controle de Vesão com o Git 8 | 9 | *Criado por Myriam Leggieri, [@iammyr](https://twitter.com/iammyr)* 10 | *para [Rails Girls Galway](https://github.com/RailsGirlsGalway)* 11 | *Traduzido por Luiz Santos, [@santosluiz](https://github.com/santosluiz)* 12 | 13 | Os tutoriais básicos que foram mesclados e adaptados são: [Tutorial Ruby on Rails](http://www.railstutorial.org/book), [App RailsGirls](http://guides.railsgirls.com/app/) e o tutorial para [criação de thumbnails](http://guides.railsgirls.com/thumbnails), [autenticando usuários](http://guides.railsgirls.com/devise/), [adicionando um design](http://guides.railsgirls.com/design), [implementando com o OpenShift](http://guides.railsgirls.com/openshift/) e [adicionando comentários](http://guides.railsgirls.com/commenting). 14 | 15 | 16 | Navegue até o diretório principal do primeiro app e inicialize um novo repositório: 17 | 18 |
19 |
20 | {% highlight sh %} 21 | $ git init 22 | {% endhighlight %} 23 |
24 |
25 | 26 | Antes de adicionar o projeto ao repositório, vamos dizer ao Git quais arquivos ele deve ignorar listando no arquivo .gitignore. O comando "rails new" já cria o arquivo .gitignore, mas vamos estendê-lo com seguinte comando: 27 | 28 |
29 |
30 | {% highlight sh %} 31 | # Ignore outros arquivos desnecessários. 32 | database.yml 33 | # Ignore a documentação do Rails 34 | doc/ 35 | # Ignore Vim e Emacs 36 | *.swp 37 | *~ 38 | .project 39 | # Ignore (para usuários de macOS) o diretório .DS_Store criado pelo Mac Finder application 40 | .DS_Store 41 | .idea 42 | .secret 43 | {% endhighlight %} 44 |
45 |
46 | 47 | Adicione as alterações (recursivamente, adicionando todos os sub-diretórios). 48 |
49 |
50 | {% highlight sh %} 51 | git add . 52 | {% endhighlight %} 53 |
54 |
55 | 56 | O comando `git add`, adiciona os arquivos do projeto área de stage, onde contém as alterações pendentes no seu projeto; Você pode ver quais arquivos estão na área de stage utilizando o comando status: 57 | 58 |
59 |
60 | {% highlight sh %} 61 | $ git status 62 | {% endhighlight %} 63 |
64 |
65 | 66 | Agora, faça o commit justificando o motivo de tal ação: 67 |
68 |
69 | {% highlight sh %} 70 | $ git commit -m "Inicializando Repositório" 71 | {% endhighlight %} 72 |
73 | Os commits do Git são locais. Eles são gravados apenas na máquina utilizada, na máquina em que os commits ocorrem. Você pode ver a lista com todos os commits com o `git log`, digitando `q` para sair. 74 |
75 | 76 | Agora, queremos enviar nossas alterações para um repositório remoto: 77 | [Criando um repositório](http://github.com/new) chamado "railsgirls-galway" e inserindo informações. Não inicie um repositório com o arquivo "README", pois o comando `rails new` já cria automaticamente. 78 | Envie as alterações locais para o repositório remoto desta forma: 79 | 80 |
81 |
82 | {% highlight sh %} 83 | $ git remote add origin https://github.com//railsgirls-galway.git 84 | $ git push -u origin master 85 | {% endhighlight %} 86 |
87 | O resultado é uma página no GitHub (por exemplo, [aqui está o meu](https://github.com/iammyr/railsgirls-galway-2014)) para o repositório da nossa aplicação, que fornece renderização agradável, compartilhando funcionalidades e estatísticas. Veja aqui: https://github.com//railsgirls-galway 88 |
89 | 90 | **Instrutor(a):** Explique como funciona o branch, edit, commit e merge no GitHub: altere seu projeto adicionando uma descrição no README. 91 | ([Slides por Myriam Leggieri @iammyr]()) 92 | 93 | {% include other-guides.md page="touristic-autism_git" %} 94 | -------------------------------------------------------------------------------- /_posts/2014-05-29-touristic-autism_google-map.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Aplicativo de Pontos Turísticos amigável para autistas 4 | permalink: touristic-autism_google-map 5 | --- 6 | 7 | # Mostrar todo os lugares no Google Map 8 | 9 | *Criado por Myriam Leggieri, [@iammyr](https://twitter.com/iammyr)* 10 | *para [Rails Girls Galway](https://github.com/RailsGirlsGalway)* 11 | *Traduzido por Elaine Martins, [@astronomaelaine](https://twitter.com/astronomaelaine)* 12 | 13 | 59/5000 14 | Os guias básicos que foram mesclados e adaptados são o [Ruby on Rails Tutorial](http://www.railstutorial.org/book), o [RailsGirls app básico](http://guides.railsgirls.com/app/) e os tutoriais para [criar thumbnails (miniaturas)](http://guides.railsgirls.com/thumbnails), [autenticando usuários](http://guides.railsgirls.com/devise/), [adicionando visual](http://guides.railsgirls.com/design), [deploying para OpenShift](http://guides.railsgirls.com/openshift/) e [adicionando comentários](http://guides.railsgirls.com/commenting). 15 | 16 | 17 | É preciso instalar um software que permite visualizar e interagir com o Google Maps. 18 | 19 | Abra `Gemfile` no diretório do projeto utilizando o editor de texto de sua preferência e adicione as linhas 20 | 21 | {% highlight ruby %} 22 | gem 'gmaps4rails' 23 | {% endhighlight %} 24 | 25 | 26 | Agrupe como o de costume. Depois, adicione as linhas abaixo a um novo arquivo `app/model/marker.rb`: 27 | 28 | {% highlight ruby %} 29 | class Marker 30 | 31 | include ActiveModel::Validations 32 | include Gmaps4rails::ActsAsGmappable 33 | 34 | acts_as_gmappable :position => :location 35 | 36 | attr_accessor :location 37 | 38 | def gmaps4rails_infowindow 39 | 'foo' 40 | end 41 | 42 | end 43 | {% endhighlight %} 44 | 45 | Depois, adicione a `config/application.rb`, dentro do bloco do seu projeto: 46 | 47 | {% highlight ruby %} 48 | config.active_support.escape_html_entities_in_json = true 49 | config.encoding = "utf-8" 50 | config.filter_parameters += [:password] 51 | config.assets.enabled = true 52 | config.assets.version = '1.0' 53 | {% endhighlight %} 54 | 55 | Crie o seu `app/controllers/google_controller.rb`: 56 | 57 | {% highlight ruby %} 58 | class GoogleController < ApplicationController 59 | def index; end 60 | 61 | def markers 62 | @marker ||= (1..10).map { 63 | m = Marker.new 64 | m.location = [ (Random.new.rand(-5000..5000) / 100.0),(Random.new.rand(-5000..5000) / 100.0) ] 65 | m 66 | }.to_gmaps4rails 67 | end 68 | helper_method :markers 69 | 70 | end 71 | {% endhighlight %} 72 | 73 | Crie o seu `view/google/index.html.erb`: 74 | 75 | {% highlight erb %} 76 |

Veja algum marcador no seu mapa por padrao

77 |
78 | <%= gmaps("markers" => {"data" => markers}, 79 | 'last_map' => false, 80 | "map_options" => { 81 | "center_on_user" => true, 82 | "detect_location" => true, 83 | "provider" => "google", :id => 'google_map'}) %> 84 | 85 |

Veja no OpenLayer

86 |
87 | 88 | <%= gmaps("markers" => {"data" => markers}, 89 | "map_options" => { 90 | "center_on_user" => true, 91 | "detect_location" => true, 92 | "provider" => "openlayers", :id => 'openlayer_map'}) %> 93 | {% endhighlight %} 94 | 95 | Adicione as linhas abaixo em `app/views/application.html.erb` depois de `<%= yield %>`: 96 | 97 | {% highlight erb %} 98 | <%= yield :scripts %> 99 | {% endhighlight %} 100 | 101 | Para finalizar, adicione as linhas abaixo em `config/routes.rb`: 102 | 103 | {% highlight ruby %} 104 | get '/google' => 'google#index' 105 | root :to => 'google#index' 106 | {% endhighlight %} 107 | 108 | {% include other-guides.md page="touristic-autism_google-map" %} 109 | -------------------------------------------------------------------------------- /_posts/2014-05-29-touristic-autism_image-upload.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Touristic Autism-friendly Spots App 4 | permalink: touristic-autism_image-upload 5 | --- 6 | 7 | # Upload de imagens e miniaturas 8 | 9 | *Criado por Myriam Leggieri, [@iammyr](https://twitter.com/iammyr)* *para [Rails Girls Galway](https://github.com/RailsGirlsGalway)* 10 | 11 | *Traduzido por Rafael Vianna, [@RFerreiraVianna](https://twitter.com/rferreiravianna) 12 | 13 | Os guias básicos que foram mesclados e adaptados são os [Ruby on Rails Tutorial](http://www.railstutorial.org/book), o [basic RailsGirls app](http://guides.railsgirls.com/app/) e os tutoriais são: [creating thumbnails](http://guides.railsgirls.com/thumbnails), [authenticating users](http://guides.railsgirls.com/devise/), [adding design](http://guides.railsgirls.com/design), [deploying to OpenShift](http://guides.railsgirls.com/openshift/) e [adding comments](http://guides.railsgirls.com/commenting). 14 | 15 | Nós precisamos instalar uma nova Gem que nos permita fazer upload de arquivos no Rails. 16 | 17 | Abra `Gemfile` na sua pasta do projeto usando seu editor de texto e adicione: 18 | 19 | {% highlight ruby %} 20 | gem 'carrierwave' 21 | {% endhighlight %} 22 | 23 | No terminal execute: 24 | 25 | {% highlight sh %} 26 | bundle 27 | {% endhighlight %} 28 | 29 | Agora podemos gerar o código para a execução do upload. No terminal, execute: 30 | 31 | {% highlight sh %} 32 | rails generate uploader Picture 33 | {% endhighlight %} 34 | 35 | Nesse momento você irá **precisar reiniciar o servidor do Rails** no terminal. 36 | 37 | Precione Ctrl+C no terminal para parar o servidor. Uma vez parado, você pode apertar a seta pra cima no seu teclado para encontrar o último comando executado, então pressione o enter para iniciar o servidor novamente. 38 | 39 | Isso é necessário para que o app carregue a biblioteca adicionada. 40 | 41 | Abra `app/models/place.rb` e adicione: 42 | 43 | {% highlight erb %} 44 | mount_uploader :picture, PictureUploader 45 | {% endhighlight %} 46 | 47 | Abra `app/views/places/_form.html.erb` e mude: 48 | 49 | {% highlight erb %} 50 | <%= f.text_field :picture %> 51 | {% endhighlight %} 52 | 53 | para: 54 | 55 | {% highlight erb %} 56 | <%= f.file_field :picture %> 57 | {% endhighlight %} 58 | 59 | 60 | Algumas vezes você pode obter um *TypeError: can't cast ActionDispatch::Http::UploadedFile to string*. 61 | 62 | Se isso acontecer, no arquivo `app/views/places/_form.html.erb` mude a linha: 63 | 64 | {% highlight erb %} 65 | <%= form_for(@place) do |f| %> 66 | {% endhighlight %} 67 | 68 | para: 69 | 70 | {% highlight erb %} 71 | <%= form_for @place, :html => {:multipart => true} do |f| %> 72 | {% endhighlight %} 73 | 74 | Agora, se você executar o seu servidor e tentar adicionar um novo local com uma imagem, você notará que a imagem não parece bonita porque mostra apenas um caminho para o arquivo. Vamos consertar isso. 75 | 76 | Abra `app/views/places/show.html.erb` e mude: 77 | 78 | {% highlight erb %} 79 | <%= @place.picture %> 80 | {% endhighlight %} 81 | 82 | para: 83 | 84 | {% highlight erb %} 85 | <%= image_tag(@place.picture_url, :width => 600) if @place.picture.present? %> 86 | {% endhighlight %} 87 | 88 | Agora recarregue seu navegador para ver a mudança. 89 | 90 | **Instrutor(a):** Fale um pouco sobre HTML. 91 | 92 | __Instrutor(a)__: Explique o que especifica a largura da imagem em HTML no final da etapa 93 | 4 e como ele difere do redimensionamento de imagens no servidor. 94 | 95 | ## Instalando ImageMagick 96 | 97 | * macOS: Execute `brew install imagemagick`. Se você não tiver o comando brew, você pode [instalar aqui][in-homebrew]. 98 | * Windows: Baixe e execute [ImageMagick installer][im-win] (use o primeiro 99 | *download* link de download). Depois reabra o Shell de comando do Rails. 100 | * Linux: No Ubuntu e Debian, execute `sudo apt-get install imagemagick`. Use o gerenciador de pacote apropriado ao invés de usar `apt-get` para outras distribuições. 101 | 102 | [im-win]: http://www.imagemagick.org/script/binary-releases.php?ImageMagick=vkv0r0at8sjl5qo91788rtuvs3#windows 103 | [in-homebrew]: http://mxcl.github.io/homebrew/ 104 | 105 | __Instrutor(a)__: O que é ImageMagick e o que difere das bibliotecas usadas anteriormente? 106 | 107 | Abra `Gemfile` no projeto e adicione: 108 | 109 | {% highlight ruby %} 110 | gem 'mini_magick', '3.5.0' 111 | {% endhighlight %} 112 | 113 | No terminal execute: 114 | 115 | {% highlight sh %} 116 | bundle 117 | {% endhighlight %} 118 | 119 | ## Fazendo nosso app criar miniaturas quando uma imagem é adicionada 120 | 121 | Abra `app/uploaders/picture_uploader.rb` e ache a seguinte linha: 122 | 123 | {% highlight ruby %} 124 | # include CarrierWave::MiniMagick 125 | {% endhighlight %} 126 | 127 | Remova o `#`. 128 | 129 | __Instrutor(a)__: Explique o conceito de comentários no código.. 130 | 131 | Abaixo da linha que você acabou de alterar, adicione: 132 | 133 | {% highlight ruby %} 134 | version :thumb do 135 | process :resize_to_fill => [50, 50] 136 | end 137 | {% endhighlight %} 138 | 139 | As imagens carregadas a partir de agora serão redimencionadas, mas as imagens que já foram feitas não serão afetadas. 140 | Então, edite um dos lugares existentes e volte a adicionar uma imagem. 141 | 142 | ## Mostrando as thumbnails 143 | 144 | Para ver se a imagem carregada foi redimencionada abra, 145 | `app/views/places/index.html.erb`. Mude a linha: 146 | 147 | {% highlight erb %} 148 |
149 | {% endhighlight %} 150 | 151 | para: 152 | 153 | {% highlight erb %} 154 | 155 | {% endhighlight %} 156 | 157 | Dê uma olhada no seu navegador para ver se a miniatura está lá. 158 | 159 | {% include other-guides.md page="touristic-autism_image-upload" %} 160 | -------------------------------------------------------------------------------- /_posts/2014-05-29-touristic-autism_intro.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: App para turismo de autismo amigável 4 | permalink: touristic-autism_intro 5 | --- 6 | 7 | # Rails Girls Tutorial de uma aplicação turística para Autistas 8 | 9 | *Criado por Myriam Leggieri, [@iammyr](https://twitter.com/iammyr)* 10 | *para [Rails Girls Galway](https://github.com/RailsGirlsGalway)* 11 | 12 | *Traduzido por Luiz Santos, [@santosluiz](https://github.com/santosluiz)* 13 | 14 | Este tutorial mescla, adapta e extende alguns dos guias básicos do RailsGirls **para o cenário de**: descrever, exibir e comentar locais turísticos e avaliá-los com o autismo amigável. Esta aplicação foi solicitada por [Galway Autism Partnership](http://www.galwayautismpartnership.com/) para ajudar autistas adultos em suas viagens. 15 | 16 | A extensão é composta de **novas funcionalidades**: 17 | 18 | * Tutorial de TDD 19 | * Avaliação de Recurso 20 | * Configuração de permissão para usuário autenticado (via devise) 21 | 22 | Os tutoriais básicos que foram mesclados e adaptados são: [Tutorial Ruby on Rails](http://www.railstutorial.org/book), [App RailsGirls](http://guides.railsgirls.com/app/) e o tutorial para [criação de thumbnails](http://guides.railsgirls.com/thumbnails), [autenticando usuários](http://guides.railsgirls.com/devise/), [adicionando um design](http://guides.railsgirls.com/design), [implementando com o OpenShift](http://guides.railsgirls.com/openshift/) e [adicionando comentários](http://guides.railsgirls.com/commenting). 23 | 24 | 25 | ### [0. Instalação](/install) 26 | 27 | **Certifique-se de que você possui o Rails e o Git instalados.** [**Siga o tutorial de instação**](/install), em seguinda [**Instale o Git**](http://www.git-scm.com/book/en/Getting-Started-Installing-Git). Então, configure o GitHub inserindo estes comandos no terminal: 28 | 29 | {% highlight sh %} 30 | $ git config --global user.name "Seu Nome" 31 | $ git config --global user.email seu.email@example.com 32 | {% endhighlight %} 33 | 34 |

Etapas de configuração do GitHub.

35 | 36 | Crie uma [conta grátis no GitHub](https://github.com/signup/free), caso você ainda não possua uma. 37 | 38 | 39 | ### [1. Aplicação Web Básica](touristic-autism_basic-app) 40 | 41 | ### [2. Controle de versão com Git](touristic-autism_git) 42 | 43 | ### [3. Modelagem de Recursos](touristic-autism_resource-modeling) 44 | 45 | ### [4. Avaliação de Recursos](touristic-autism_resource-rating) 46 | 47 | ### [5. Design](touristic-autism_design) 48 | 49 | ### [6. Upload de imagens e Thumbnails](touristic-autism_image-upload) 50 | 51 | **Opcional - para Garotas Rails avançadas:** 52 | ### [7. Implatanção Contínua](touristic-autism_continuous-deployment) 53 | 54 | ### [8.Teste e Integração Contínua](touristic-autism_static-pages-tdd) 55 | 56 | # Anexo 57 | ## Desfazendo Coisas 58 | 59 | O Rails possui ferramentas que facilitam bastante a recuperação de erros. 60 | 61 | Por exemplo, você pode decidir alterar o nome do controller. Uma vez que, ao gerar o controller, o Rails cria muito mais arquivos que o controller. Desfazer essa operação, significa a remoção de um conjunto de arquivos. No Rails, isso pode ser feito com o `rails destroy`. Em particular, estes dois comandos cancelam um ao outro: 62 | 63 | {% highlight sh %} 64 | $ rails generate controller FooBars baz quux 65 | $ rails destroy controller FooBars baz quux 66 | {% endhighlight %} 67 | 68 | De uma forma análoga, depois geramos um modelo assim: 69 | 70 | {% highlight sh %} 71 | $ rails generate model Foo bar:string baz:integer 72 | {% endhighlight %} 73 | 74 | Isso pode ser desfeito utilinzado: 75 | 76 | {% highlight sh %} 77 | $ rails destroy model Foo 78 | {% endhighlight %} 79 | 80 | As migrações alteram o estado do banco de dados: 81 | 82 | {% highlight sh %} 83 | $ rake db:migrate 84 | {% endhighlight %} 85 | 86 | Podemos desfazer uma única migração utilizando: 87 | 88 | {% highlight sh %} 89 | $ rake db:rollback 90 | {% endhighlight %} 91 | 92 | Para voltar ao início, basta inserir: 93 | 94 | {% highlight sh %} 95 | $ rake db:migrate VERSION=0 96 | {% endhighlight %} 97 | 98 | Como você pode imaginar, substituindo o 0 por qualquer outro número, vai fazer com que a migração ocorra para aquela versão. Onde os números de versão listam as migrações sequencialmente. 99 | 100 | Para apagar a table do banco de dados, digite: 101 | 102 | {% highlight sh %} 103 | $ rails console 104 | {% endhighlight %} 105 | 106 | Então, basta inserir o comando: 107 | 108 | {% highlight sh %} 109 | ActiveRecord::Migration.drop_table(:) 110 | {% endhighlight %} 111 | 112 | Você pode acessar o banco de dados diretamente (caso seja sqlite3, digite ".quit" para sair), utilizando: 113 | 114 | {% highlight sh %} 115 | $ rails db 116 | {% endhighlight %} 117 | 118 | {% include other-guides.md page="touristic-autism_intro" %} 119 | -------------------------------------------------------------------------------- /_posts/2014-05-29-touristic-autism_resource-rating.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: App para turismo de autismo amigável 4 | permalink: touristic-autism_resource-rating 5 | --- 6 | 7 | # Avaliação de Recurso 8 | 9 | *Criado por Myriam Leggieri, [@iammyr](https://twitter.com/iammyr)* 10 | *para [Rails Girls Galway](https://github.com/RailsGirlsGalway)* 11 | 12 | *Traduzido por Beatriz Rezener, [@beatrizrezener](https://github.com/beatrizrezener)* 13 | 14 | Os tutoriais básicos que foram mesclados e adaptados são: [Tutorial Ruby on Rails](http://www.railstutorial.org/book), [App RailsGirls](http://guides.railsgirls.com/app/) e os tutoriais para [criação de thumbnails](http://guides.railsgirls.com/thumbnails), [autenticando usuários](http://guides.railsgirls.com/devise/), [adicionando design](http://guides.railsgirls.com/design), [implantando com o OpenShift](http://guides.railsgirls.com/openshift/) e [adicionando comentários](http://guides.railsgirls.com/commenting). 15 | 16 | O que queremos que nosso app faça? Primeiramente, nós gostaríamos de: 17 | * autenticar **usuários** 18 | * permitir usuários autenticados a criar uma nova descrição de **local** turístico 19 | * permitir usuários autenticados a **comentar** esses lugares 20 | * permitir usuários autenticados a **avaliar** até que ponto esses locais são ou não amigáveis ao autismo. 21 | 22 | Até então, nós modelamos e implementamos recursos de comentários, usuários e locais. Vamos agora habilitar a avaliação para lugares. 23 | 24 | ## Avaliando Locais 25 | 26 | ## Passo 0: Adicionar a gem letsrate 27 | 28 | Abra o seu `Gemfile` e adicione a linha: 29 | 30 | {% highlight ruby %} 31 | gem "letsrate", :git => "git://github.com/iammyr/letsrate.git" 32 | {% endhighlight %} 33 | e execute 34 | {% highlight sh %} 35 | bundle install 36 | {% endhighlight %} 37 | para instalar a gem. **Além disso, lembre-se de reiniciar o servidor Rails**. 38 | 39 | ## Passo 1: Configure o letsrate em seu app 40 | 41 | Execute o comando a seguir no terminal (estamos assumindo que já habilitamos a autenticação de usuários usando a gem `Devise`). 42 | 43 | {% highlight sh %} 44 | rails g letsrate user 45 | {% endhighlight %} 46 | 47 | ## Step 2: Aplique letsrate a seu recurso 48 | 49 | Você deve adicionar a função `letsrate_rateable`, com sua opção de dimensões, ao modelo do recurso que você deseja avaliar, por exemplo, local. Você pode ter múltiplas dimensões. 50 | 51 | Em `app/models/place.rb` adicione 52 | 53 | {% highlight ruby %} 54 | letsrate_rateable "autismo_amigavel", "geral" 55 | {% endhighlight %} 56 | 57 | Então você precisa adicionar uma chamada a `letsrate_rater` no modelo de usuário: 58 | 59 | {% highlight ruby %} 60 | letsrate_rater 61 | {% endhighlight %} 62 | 63 | ## Step 3: Render the Views 64 | 65 | Há um método auxiliar chamado `rating_for` para adicionar as estrelas de avaliação. Por padrão, `rating_for` irá mostrar a média das avaliações e aceitará uma nova avaliação de um usuário autenticado. 66 | 67 | Abra `app/views/places/show.html.erb` e adicione 68 | 69 | {% highlight erb %} 70 |

71 | Votos:
72 | Autismo amigável : <%= rating_for @local, "autismo_amigavel" %>
73 | Geral : <%= rating_for @local, "geral" %> 74 |

75 |
76 |

77 | Seus votos:
78 | Autismo amigável : <%= rating_for_user @local, current_user, "autismo_amigavel", :star => 7 %> 79 | Geral : <%= rating_for_user @local, current_user, "geral", :star => 7 %> 80 |

81 |
82 | {% endhighlight %} 83 | 84 | Você pode usar o método auxiliar `rating_for_user` para mostrar a avaliação de estrelas para o usuário. 85 | 86 | 87 | É isso aí! ^__^ 88 | Experimente reiniciar o servidor, dê um add, commit e push no GitHub. Se tudo estiver funcionando, você também pode implantar ;) 89 | 90 | {% include other-guides.md page="touristic-autism_resource-rating" %} 91 | -------------------------------------------------------------------------------- /_posts/2015-08-16-sinatra-app-tutorial-in-bulgarian.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Rails Girls приложение със Sinatra 4 | permalink: sinatra-app-bg 5 | --- 6 | 7 | # Създайте сайт за гласуване със Sinatra 8 | 9 | *Базирано на [това ръководство](http://guides.railsgirls.com/sinatra-app/) от Piotr Szotkowski, [@chastell](https://twitter.com/chastell)* 10 | 11 | We will create a little voting app from scratch using a web development framework for Ruby called Sinatra, which is much like Ruby on Rails. Just another tool to get the job done really, and a fun one too! 12 | 13 | Imagine your group of friends is figuring out what to order for your weekly movie watching marathon. With the many fast food options out there, this can become quite a discussion. This is where our app comes into play! 14 | 15 | __INSTRUTOR(A)__: Explain shortly what [Sinatra](http://www.sinatrarb.com) is. 16 | 17 | ## Install Sinatra 18 | 19 | Remember how we needed to install Ruby on Rails? Similarly we need to install Sinatra: 20 | 21 | `gem install sinatra` 22 | 23 | ### Create your first Sinatra app 24 | 25 | Create a `suffragist.rb` file with the following contents: 26 | 27 | {% highlight ruby %} 28 | require 'sinatra' 29 | 30 | get '/' do 31 | 'Hello, voter!' 32 | end 33 | {% endhighlight %} 34 | 35 | 36 | You can actually call your Ruby file whatever you'd like. `vote.rb` for instance would totally work as well, when used consistently. But [suffragist](http://www.vocabulary.com/dictionary/suffragist) actually references to a super important event in the women's rights movement, so let's just go with that for now! 37 | 38 | 39 | ### Run your app 40 | 41 | Go to the directory where you put your app and run `ruby suffragist.rb`. 42 | Now you can visit [localhost:4567](http://localhost:4567). You should 43 | see a ‘Hello, voter!’ page, which means that the generation of your new 44 | app worked correctly. Hit Ctrl+C in the terminal to quit the server. 45 | 46 | __INSTRUTOR(A)__: Explain POST and GET methods, and how to communicate with the browser. 47 | 48 | 49 | 50 | ### Add the index view 51 | 52 | To keep everything in order let’s make 53 | a directory for our views (and name it `views`). 54 | 55 | Put this code into an `index.erb` file in the `views` directory: 56 | 57 | {% highlight erb %} 58 | 59 | 60 | 61 | 62 | Suffragist 63 | 64 | 65 | 66 |

What's for dinner?

67 |
68 |
    69 | <% Choices.each do |id, text| %> 70 |
  • 71 | 75 |
  • 76 | <% end %> 77 |
78 | 79 | 80 | 81 | 82 | {% endhighlight %} 83 | 84 | And into `suffragist.rb`: 85 | 86 | {% highlight ruby %} 87 | Choices = { 88 | 'HAM' => 'Hamburger', 89 | 'PIZ' => 'Pizza', 90 | 'CUR' => 'Curry', 91 | 'NOO' => 'Noodles', 92 | } 93 | {% endhighlight %} 94 | 95 | Change the `get` action: 96 | 97 | {% highlight ruby %} 98 | get '/' do 99 | erb :index 100 | end 101 | {% endhighlight %} 102 | 103 | Run `ruby suffragist.rb`, check your 104 | results and quit the server with Ctrl+C. 105 | 106 | __INSTRUTOR(A)__: Talk a little about HTML and erb. Explain 107 | templates. Explain what global constants are. 108 | 109 | 110 | 111 | ### Templates 112 | 113 | Adjust the `index.erb` file in the `views` 114 | directory and add the `

` line: 115 | 116 | {% highlight erb %} 117 | 118 |

<%= @title %>

119 |

What's for dinner?

120 | {% endhighlight %} 121 | 122 | Change the `get` action: 123 | 124 | {% highlight ruby %} 125 | get '/' do 126 | @title = 'Welcome to the Suffragist!' 127 | erb :index 128 | end 129 | {% endhighlight %} 130 | 131 | __INSTRUTOR(A)__: Explain what instance variables are and 132 | how Sinatra makes them visible in the views. 133 | 134 | 135 | 136 | ### Add the ability to POST results 137 | 138 | Put this into `suffragist.rb`: 139 | 140 | {% highlight ruby %} 141 | post '/cast' do 142 | @title = 'Thanks for casting your vote!' 143 | @vote = params['vote'] 144 | erb :cast 145 | end 146 | {% endhighlight %} 147 | 148 | Create a new file in the `views` directory, `cast.erb`, 149 | and put there some HTML with embedded Ruby code: 150 | 151 | {% highlight erb %} 152 | 153 | 154 | 155 | 156 | Suffragist 157 | 158 | 159 | 160 |

<%= @title %>

161 |

You cast: <%= Choices[@vote] %>

162 |

See the results!

163 | 164 | 165 | {% endhighlight %} 166 | 167 | __INSTRUTOR(A)__: Explain how POST works. How to catch what 168 | was sent in the form? Where do `params` come from? 169 | 170 | 171 | 172 | ### Factor out a common layout 173 | 174 | Create a `layout.erb` file in the `views` 175 | directory. Put the following in there: 176 | 177 | {% highlight erb %} 178 | 179 | 180 | 181 | 182 | Suffragist 183 | 184 | 185 | 186 |

<%= @title %>

187 | <%= yield %> 188 | 189 | 190 | {% endhighlight %} 191 | 192 | Remove the above part from the other two templates 193 | (`index.erb` and `cast.erb` in the `views` directory). 194 | 195 | __INSTRUTOR(A)__: Talk about the structure of HTML documents and how factoring 196 | out common code work in general. Explain what `yield` does. 197 | 198 | 199 | 200 | ### Add the results route and the results view 201 | 202 | Paste the following code into `suffragist.rb`: 203 | 204 | {% highlight ruby %} 205 | get '/results' do 206 | @votes = { 'waw' => 7, 'krk' => 5 } 207 | erb :results 208 | end 209 | {% endhighlight %} 210 | 211 | Create a new file in the `views` directory, called `results.erb`. 212 | 213 | {% highlight erb %} 214 |
<%= place.picture %><%= image_tag place.picture_url(:thumb) if place.picture? %>
215 | <% Choices.each do |id, text| %> 216 | 217 | 218 | 220 | 221 | <% end %> 222 |
<%= text %><%= @votes[id] || 0 %> 219 | <%= '#' * (@votes[id] || 0) %>
223 |

Cast more votes!

224 | {% endhighlight %} 225 | 226 | Run `ruby suffragist.rb`, check 227 | your results and quit the server with Ctrl+C. 228 | 229 | __INSTRUTOR(A)__: Explain HTML tables and how how the 230 | missing values from the hash default to zero. 231 | 232 | 233 | 234 | ### Persist the results using YAML::Store 235 | 236 | Time for something new! Let’s store our choices. 237 | 238 | Add the following to the top of `suffragist.rb`: 239 | 240 | {% highlight ruby %} 241 | require 'yaml/store' 242 | {% endhighlight %} 243 | 244 | Add some more code into `suffragist.rb` – replace 245 | `post '/cast'` and `get '/results'` with the following: 246 | 247 | {% highlight ruby %} 248 | post '/cast' do 249 | @title = 'Thanks for casting your vote!' 250 | @vote = params['vote'] 251 | @store = YAML::Store.new 'votes.yml' 252 | @store.transaction do 253 | @store['votes'] ||= {} 254 | @store['votes'][@vote] ||= 0 255 | @store['votes'][@vote] += 1 256 | end 257 | erb :cast 258 | end 259 | 260 | get '/results' do 261 | @title = 'Results so far:' 262 | @store = YAML::Store.new 'votes.yml' 263 | @votes = @store.transaction { @store['votes'] } 264 | erb :results 265 | end 266 | {% endhighlight %} 267 | 268 | __INSTRUTOR(A)__: Explain what YAML is. 269 | 270 | 271 | ### See how the YAML file changes when votes are cast 272 | 273 | Let’s open `votes.yml`. And vote. And check again. 274 | 275 | __INSTRUTOR(A)__: There will be situations when one or more students will 276 | forget to quit the server before running it again. It’s a good 277 | opportunity to search the Internet for a solution. They don’t 278 | have to know everything about killing processes to find a solution. 279 | 280 | __INSTRUTOR(A)__: In the end explain shortly the differences between Sinatra and Rails. 281 | 282 | 283 | 284 | ## Play with the app 285 | 286 | Try to change things in the app in any way you see fit: 287 | 288 | * Add some additional logic to the views. 289 | * Redirect to the results outright. 290 | * Add other votings; how would the YAML file need to change? 291 | * Try to style the file in different ways. 292 | -------------------------------------------------------------------------------- /_posts/2015-09-11-continuous-snap-ci.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Deploy Contínuo com Snap CI 4 | permalink: continuous-snap-ci 5 | --- 6 | 7 | # Deploy Contínuo com Snap CI 8 | 9 | *Criado por Akshay Karle, [@akshay_karle](https://twitter.com/akshay_karle)* 10 | 11 | Traduzido por Giovana Morais, [@ohshitgi](https://twitterl.com/ohshitgi) 12 | 13 | ### O que é Deploy Contínuo? 14 | 15 | O deploy contínuo, ou melhor, implantação contínua é parte do "movimento" de 16 | entrega contínua. A ideia por trás da entrega contínua é a de automatizar o 17 | processo de entrega o máximo possível. 18 | 19 | Quando você trabalha com uma cadeia de implantação contínua, você força a 20 | implantação via Git (tudo precisa estar commitado para ser testado e tudo 21 | precisa ser testado para ser de fato implantado), fazendo com que a colaboração 22 | seja mais simples e a implantação seja mais rápida. Dessa forma, você pode focar 23 | em fazer a sua aplicação ainda melhor! 24 | 25 | Existem várias empresas navegando na onda da entrega contínua, mas nesse guia 26 | vamos usar a implantação contínua da nossa aplicação Ruby on Rails do GitHub 27 | para o Heroku usando o [Snap CI](https://snap-ci.com). 28 | 29 | __INSTRUTOR(A)__: Fale sobre os benefícios da implantação contínua. 30 | 31 | ### Se inscrevendo no Snap CI 32 | 33 | Primeiro, você vai precisar de [uma conta do Snap CI](https://snap-ci.com/). 34 | Se inscreva no Snap CI com sua conta do GitHub. O Snap CI precisa ter acesso aos seus 35 | repositórios para conseguir configurar os ambientes, então certifique-se de que 36 | você está permitindo isso. 37 | 38 | De volta ao Snap CI, vamos criar nosso primeiro pipeline. O primeiro passo é 39 | selecionar o GitHub como seu provedor de repositórios. Após isso, na lista dos seus 40 | repositórios do GitHub, procure pelo repositório que deseja fazer o processo 41 | de implantação e o selecione. 42 | No nosso caso, é o repositório que tem um nome como "railsgirls". 43 | 44 | Uma vez que você selecionou o repositório que deseja fazer o build, o Snap 45 | CI vai tentar montar automaticamente o melhor setup para seu 46 | [pipeline de implantação](http://martinfowler.com/bliki/DeploymentPipeline.html), 47 | o que permitirá a você rodar seus testar e implantação. 48 | 49 | Depois de alguns segundos, Snap CI vai automaticamente começar o build do 50 | seu repositório. Nesse ponto, você pode clicar entre os estágios de setup do 51 | Snap CI pra ver que tipo de comandos ele roda. 52 | 53 | Existe, contudo, a possiblidade de o Snap CI não conseguir detectar os comandos 54 | certos pra fazer o build e testar o seu repositório. Nesses casos, você pode editar 55 | as configurações do seu pipeline visitando a página de configurações 56 | (Configurations) na página de Builds do seu recém-criado pipeline, por fim 57 | acessando a opção de edição (Edit). Nessa opção, você pode adicionar ou editar 58 | um estágio existente que vai fazer o build rodar todos os testes da sua 59 | aplicação. 60 | 61 | Se você não tem certeza dos estágios que deve adicionar, você pode dar uma 62 | olhada nas diferentes configurações de Build que ficam na sub-categoria Ruby quando 63 | você vai adicionar um estágio. Essas configurações podem te ajudar a entender que 64 | tipo de comando devem ser rodados para fazer o build e testar sua aplicação 65 | corretamente. Você também pode checar o 66 | [getting started guide](https://docs.snap-ci.com/getting-started/) (guia para 67 | começar) na documentação do Snap CI. 68 | 69 | Uma vez que você terminou de editar a sua configuração de pipeline, clique em 70 | Salvar (Save). Isso vai salvar suas configurações e automaticamente iniciar um novo 71 | build. Se todos os seus testes passaram corretamente, você agora deve ter um 72 | build verde. 73 | 74 | No caso de algum teste ter falhado, você pode fazer as correções e subir para 75 | o seu repositório no GitHub: 76 | 77 | {% highlight sh %} 78 | git add . 79 | git commit -m "ajustando testes" 80 | git push origin master 81 | {% endhighlight %} 82 | 83 | O Snap CI vai automaticamente detectar as mudanças do GitHub e rodar uma nova 84 | instância do pipeline. Neste ponto, você já está testando o seu código. 85 | 86 | ### Fazendo o Setup da Implantação Contínua 87 | 88 | O próximo passo é implantar a nossa aplicação. Existem várias plataformas para 89 | realizar essa tarefa, mas, por agora, vamos focar em como implantar no 90 | [Heroku](https://www.heroku.com/), já que é o mais simples. 91 | 92 | Vá até a página de edição de configuração do seu pipeline e adicione um novo 93 | estágio (Stage). Dessa vez, selecione a categoria "Deploy" disponível nas 94 | configurações à esquerda. Depois, selecione a receite "Basic" na sub-categoria 95 | "Heroku". 96 | 97 | Escolha e digite um nome de estágio de sua escolha (ex: deploy, implantacao, 98 | producao, etc), mantenha o trigger automático, clique no dropdown "Run as" para 99 | entrar no Heroku. Entre no Heroku e autorize o Snap CI. Você deve ser 100 | automaticamente redirecionado de volta para a página do Snap CI após a 101 | autorização. Agora você pode selecionar a aplicação do Heroku que você deseja 102 | fazer a implantação ou criar uma nova aplicação diretamente do Snap CI. 103 | Selecione a opção "Perform DB migrate" (Fazer a migração de banco de dados) e 104 | salve sua configuração. 105 | 106 | Isso deve ativar um novo build no Snap CI, mas dessa vez ele roda o estágio que 107 | você acabou de criar, que é responsável por fazer a implantação no Heroku. Uma 108 | vez que o pipeline fica verde, você pode visitar a página da aplicação no 109 | Heroku onde você implantou direto do Snap CI e sua aplicação rails deve estar 110 | online em alguns minutos. 111 | 112 | A partir daqui, quaisquer mudanças que você fizer e subir para o seu GitHub vão 113 | ser testadas e implantadas automaticamente pelo Snap CI. 114 | 115 | {% include other-guides.md page="continuous-snap-ci" %} 116 | -------------------------------------------------------------------------------- /_posts/2016-08-12-twitter-widget.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Twitter widget 4 | permalink: twitter-widget 5 | --- 6 | 7 | # Twitter widget 8 | 9 | *Criado por Asta Bevainyte, [@astux7](https://twitter.com/astux7)* 10 | *Traduzido por Vilmar Neto, [@Dkmister](https://github.com/Dkmister)* 11 | 12 | Esta prática se destina a ensinar como usar o widget do Twitter e como para [http://localhost:3000/pages/info](http://localhost:3000/pages/info) 13 | 14 | Há duas maneiras de fazer isto, se você quiser fazer rápido para já ir adicionando um código preparado, vá para o 2º parágrafo. 15 | 16 | **Instrutor(a)** Explique o que é widget. 17 | 18 | 19 | 1. Configuração do widget do Twitter 20 | 21 | + Logue-se no [Twitter](https://twitter.com/) 22 | 23 | + Vá para [https://publish.twitter.com/#](https://publish.twitter.com/#) 24 | 25 | + Selecione o que você gostaria de embutir, .i.e seu *perfil* então o link deve parecer como o seguinte (https://twitter.com/_seu_username_no_twitter) 26 | 27 | + Selecione display options entre 'Embedded Timeline' ou 'Twitter Buttons' 28 | 29 | + Copie o código 30 | 31 | 32 | 2. Adicione o código gerado pelo Twitter a sua página de informação 33 | 34 | + Você deve ter o código do Twitter copiado que deve parecer como este se você selecionou opções de `perfil` e `embedded timeline` (*_seu_username_no_twitter* - você precisa mudar para seu nome no Twitter) 35 | 36 | {% highlight html %} 37 | 38 | 39 | {% endhighlight %} 40 | 41 | + Adicione este código para app/views/pages/info.html.erb no fim do arquivo 42 | 43 | + Salve e execute `rails server` 44 | 45 | + Abra seu browser e vá para [http://localhost:3000/pages/info](http://localhost:3000/pages/info) e cheque seu perfil no Twitter 46 | 47 | {% include other-guides.md page="twitter-widget" %} 48 | -------------------------------------------------------------------------------- /_posts/2016-08-30-activeadmin.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Adicionando back-end com Active Admin 4 | permalink: backend-with-active-admin 5 | --- 6 | 7 | # Adicionando back-end com Active Admin 8 | 9 | _Criado por [Rasmus Kjellberg](https://www.rasmuskjellberg.se)_ 10 | 11 | **Este guia pressupõe que você já tenha criado um aplicativo Rails Girls** [**seguindo o guia de desenvolvimento**](/app). 12 | 13 | O Active Admin é um plugin do Ruby on Rails para gerar interfaces de estilo de administração. Ele abstrai padrões comuns de aplicativos de negócios para simplificar a implementação de interfaces bonitas e elegantes com muito pouco esforço. Você pode ler mais sobre o Active Admin [aqui](http://activeadmin.info/). 14 | 15 | ## Adicionando a gem "Active Admin" 16 | 17 | Abra seu `Gemfile` e adicione as seguintes linhas 18 | 19 | {% highlight ruby %} 20 | gem 'devise' 21 | gem 'activeadmin', github: 'activeadmin' 22 | gem 'inherited_resources', github: 'activeadmin/inherited_resources' 23 | {% endhighlight %} 24 | e rode 25 | {% highlight sh %} 26 | $ bundle install 27 | {% endhighlight %} 28 | para instalar as gems. 29 | 30 | Depois de atualizar sem bundle, rode o instalador 31 | {% highlight sh %} 32 | $ rails generate active_admin:install 33 | {% endhighlight %} 34 | 35 | O instalador cria um inicializador utilizado para configurar os padrões utilizados pelo Active Admin e uma nova pasta em `app/admin` para colocar todas as suas configrações de administrador. 36 | 37 | Migre seu banco e inicie o servidor: 38 | {% highlight sh %} 39 | $ rake db:migrate 40 | $ rails server 41 | {% endhighlight %} 42 | 43 | ## Criando sua primeira conta de administrador 44 | 45 | Abra o Rails console e crie seu novo usuário utilizando o model `AdminUser`: 46 | {% highlight sh %} 47 | $ rails console 48 | irb(main):001:0> AdminUser.create(:email => 'admin@railsgirls.com', :password => 'password123', :password_confirmation => 'password123') 49 | {% endhighlight %} 50 | 51 | Você deverá ver alguma coisa como: 52 | {% highlight sh %} 53 | 54 | # (0.3ms) begin transaction 55 | 56 | # SQL (0.4ms) INSERT INTO "admin_users" ... 57 | 58 | # (0.9ms) commit transaction 59 | 60 | {% endhighlight %} 61 | 62 | Você pode sair da sessão do console com um simples comando `exit`: 63 | {% highlight sh %} 64 | irb(main):002:0> exit 65 | {% endhighlight %} 66 | 67 | ## Acessando seu painel de administrador 68 | 69 | Visite [http://localhost:3000/admin](http://localhost:3000/admin) e faça login utilizando suas credenciais. 70 | 71 | Voila! Você está no seu novo painel de controle do Active Admin. 72 | 73 | ## Adicione "Ideas" ao back-end 74 | 75 | Para registrar seu model `Ideas` com Active Admin, rode: 76 | {% highlight sh %} 77 | $ rails generate active_admin:resource Ideas 78 | {% endhighlight %} 79 | Atualize sua página de admin e você encontrará [Ideas](http://localhost:3000/admin/ideas) na navegação. 80 | 81 | _Você pode substituir "Ideas" por qualquer model que você quiser registrar com o Active Admin._ 82 | 83 | ### Configurando Strong Parameters 84 | 85 | Para prevenir a exceção **ActiveModel::ForbiddenAttributesError in Admin::IdeasController#update** ao atualizar o model, você tem que utilizar o método [permit_params](http://activeadmin.info/docs/2-resource-customization.html) para definir quais atributos podem ter sido alterados: 86 | 87 | Abra seu arquivo `app/admin/ideia.rb` e adicione `:nome`, `:descricao` e `:imagem` ao `permit_params`: 88 | {% highlight ruby %} 89 | ActiveAdmin.register Ideia do 90 | permit_params :nome, :descricao, :imagem 91 | end 92 | {% endhighlight %} 93 | 94 | ## Remova "new", "edit" e "destroy" para usuários. 95 | 96 | Se você não quer que usuários não administradores atualize suas ideias, você pode facilmente consertar isso atualizando seu arquivo de todas para permitir apenas "index" e "show". Adicione `only: [:show, :index]` ao `config/route.rb`: 97 | {% highlight ruby %} 98 | resources :ideias, only: [:show, :index] 99 | {% endhighlight %} 100 | 101 | **Não se esqueça de remover os links agora quebrados, do seu código front-end, como:** `<%= link_to 'Nova Ideia', new_ideia_path %>`, `<%= link_to 'Editar', edit_idea_path(ideia) %>`, `<%= link_to 'Excluir', ideia, method: :delete, data: { confirm: 'Você tem certeza?' } %>` 102 | 103 | Voila! Você pode agora gerenciar uas ideias do seu novo painel de administrador! 104 | 105 | ## E agora? 106 | 107 | - Adicione outro recurso ao admin como Blog e Comentarios 108 | 109 | {% include other-guides.md page="backend-with-active-admin" %} 110 | -------------------------------------------------------------------------------- /_posts/2017-08-13-shoulda-matchers.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Simplifique seus testes com Shoulda Matchers 4 | permalink: testing-shoulda-matchers 5 | --- 6 | 7 | # Simplificando seus testes com os Shoulda Matchers 8 | 9 | _Criado por Ana Schwendler, [@anaschwendler](https://twitter.com/anaschwendler)_ 10 | 11 | _Traduzido por Frankyston Lins, [@frankyston](https://twitter.com/frankyston)_ 12 | 13 | **Este guia pressupõe que você já tenha criado um aplicativo Rails Girls** [**seguindo o guia de desenvolvimento**](/app). 14 | **O tutorial RSpec por** [**este guia**](/testing-rspec) 15 | **e o tutorial de comentários** [**este guia**](/commenting) 16 | 17 | [Shoulda Matchers](https://github.com/thoughtbot/shoulda-matchers) é uma gem de teste Ruby, que fornece linhas de comandos compatíveis com RSpec e Minitest que testam a funcionalidade comum do Rails. Esses testes seriam, de outro modo, muito mais longos, mais complexos e propensos a erros. 18 | 19 | **INSTRUTOR(A)**: Fale sobre testes e Desenvolvimento Orientado a Comportamento. 20 | 21 | ## _1._ Adicione a gem Shoulda Matchers 22 | 23 | Abra seu `Gemfile` e adicione esta linha ao grupo `:test` acima da tag end: 24 | 25 | {% highlight ruby %} 26 | group :test do 27 | ... 28 | gem 'shoulda-matchers' 29 | end 30 | {% endhighlight %} 31 | 32 | e execute 33 | {% highlight sh %} 34 | bundle install 35 | {% endhighlight %} 36 | para instalar a gem. 37 | 38 | **INSTRUTOR(A)**: Fale sobre 'googlear' a saída do terminal. 39 | 40 | ## _2._ Ajuste seu `rails_helper.rb` 41 | 42 | No nosso caso, estaremos usando o RSpec para testar nosso projeto, então precisamos dizer ao nosso `rails_helper.rb` que estamos usando o Shoulda Matchers: 43 | 44 | Coloque acima da tag end (verifique o recuo): 45 | 46 | {% highlight ruby %} 47 | Shoulda::Matchers.configure do |config| 48 | config.integrate do |with| 49 | # Escolha um framework de teste: 50 | with.test_framework :rspec 51 | with.library :rails 52 | end 53 | end 54 | {% endhighlight %} 55 | 56 | **INSTRUTOR(A)**: Fale sobre porque estamos ajustando a gem dentro de `rails_helper.rb`. 57 | 58 | No seu terminal execute 59 | {% highlight sh %} 60 | rspec spec/models/idea_spec.rb 61 | {% endhighlight %} 62 | 63 | Deve mostrar que o nosso teste está funcionando. 64 | 65 | ## _3._ Testando! 66 | 67 | É bem simples testar usando o Shoulda Matchers. 68 | Para o nosso primeiro teste já afirmamos que uma ideia tem muitos comentários, no [**Comentários para o tutorial Rails Girls App**](/commenting) 69 | 70 | Para testar se isso está funcionando corretamente, podemos adicionar as linhas abaixo ao nosso `spec/lib/idea_spec.rb`, acima do primeiro teste que criamos: 71 | 72 | {% highlight ruby %} 73 | describe "associations" do 74 | it{ is_expected.to have_many(:comments) } 75 | end 76 | {% endhighlight %} 77 | 78 | Este é um teste de associação. 79 | 80 | **INSTRUTOR(A)**: Fale sobre testes de associação. 81 | 82 | ## _4._ Desenvolvimento Orientado a Testes 83 | 84 | **INSTRUTOR(A)**: Fale sobre o TDD e como começamos a adicionar recursos ao nosso aplicativo testando-o primeiro. 85 | 86 | Outro recurso que podemos adicionar ao nosso aplicativo é criar ideias sempre nomeadas. Como poderíamos fazer isso? Vamos começar dizendo que as ideias sempre devem ter um nome. 87 | 88 | Vamos começar criando um teste para isso. Podemos fazer isso adicionando as seguintes linhas ao nosso `spec/lib/idea_spec.rb`: 89 | 90 | {% highlight ruby %} 91 | describe "validations" do 92 | it{ is_expected.to validate_presence_of :name } 93 | end 94 | {% endhighlight %} 95 | 96 | adicione-o abaixo do nosso teste de associação. 97 | 98 | Depois disso, execute no seu terminal 99 | {% highlight sh %} 100 | rspec spec/models/idea_spec.rb 101 | {% endhighlight %} 102 | 103 | Deve nos dar que não estamos validando adequadamente (e realmente não estamos). Então, para validar isso, precisamos adicionar as seguintes linhas ao nosso modelo, para que possamos validar a presença do nome em nossa Ideia. 104 | 105 | {% highlight ruby %} 106 | validates :name, presence: true 107 | {% endhighlight %} 108 | adicione-o abaixo da nossa declaração has_many. 109 | 110 | agora volte ao seu terminal e execute 111 | {% highlight sh %} 112 | rspec spec/models/idea_spec.rb 113 | {% endhighlight %} 114 | 115 | Deve dar o resultado positivo. 116 | 117 | ## _5._ Faça isso você mesmo! 118 | 119 | Você pode continuar este tutorial fazendo um teste para validar a presença de uma descrição? 120 | 121 | Você consegue imaginar outros testes para fazer? 122 | 123 | Feliz testes! 124 | 125 | {% include other-guides.md page="testing-shoulda-matchers" %} 126 | -------------------------------------------------------------------------------- /_posts/2018-02-01-passenger.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Rails Girls on Passenger 4 | permalink: passenger 5 | --- 6 | 7 | # Facilite o desenvolvimento com o Phusion Passenger 8 | 9 | _Criado por Floor Drees, [@floordrees](https://twitter.com/floordrees)_ 10 | 11 | _Traduzido por Frankyston Lins, [@frankyston](https://twitter.com/frankyston)_ 12 | 13 | ### Há um servidor de aplicativos para isso 14 | 15 | Certifique-se de seguir o [Coloque seu App no GitHub][github-guide] antes de continuar. 16 | 17 | Este guia é para facilitar o desenvolvimento de seu aplicativo (você sabe, a funcionalidade de adição e, em seguida vamos verificar se ele realmente funciona), com o Passenger. O framework Ruby on Rails fornece uma ferramenta de servidor embutida, que você pode acessar com o comando `rails server`. O "servidor rails" não é um servidor de aplicativos sozinho, mas apenas um pequeno wrapper que inicia seu aplicativo em um servidor de aplicativos. As pessoas não usam o "servidor rails" em produção (onde outras pessoas podem acessar e usar seu aplicativo) e sim um servidor de aplicativos, como o Passenger. 18 | 19 | **INSTRUTOR(A)**: O Passenger é um servidor de aplicativos da Web de código aberto. Ele lida com solicitações HTTP, gerencia processos e recursos e permite administração, monitoramento e diagnóstico de problemas. Para os grandes desenvolvedores, também há uma edição empresarial. 20 | 21 | [github-guide]: http://guides.railsgirls.com/github 22 | 23 | ### Preparando seu app 24 | 25 | #### Instalando a gem Passenger 26 | 27 | Abra o `Gemfile` do seu app e adicione o "passenger": 28 | 29 | {% highlight ruby %} 30 | gem "passenger" 31 | {% endhighlight %} 32 | 33 | Adicionando o Passenger no Gemfile, o comando `rails server` iniciará o Passenger no lugar do Puma. 34 | 35 | Você recebe pontos de bônus virtuais da equipe do Phusion Passenger por excluir as seguintes linhas (caso estejam presentes no seu Gemfile): 36 | 37 | {% highlight ruby %} 38 | gem "unicorn" 39 | gem "thin" 40 | gem "puma" 41 | {% endhighlight %} 42 | 43 | Execute `bundle install` para atualizar seus pacotes. 44 | 45 | O texto no seu terminal deve dizer algo como isto: 46 | 47 | {% highlight sh %} 48 | bundle install 49 | ... 50 | Installing passenger x.x.x 51 | ... 52 | Your bundle is complete! 53 | {% endhighlight %} 54 | 55 | O Nginx e o Apache são servidores da web. Eles fornecem manipulação de transações HTTP e servem arquivos estáticos. Os servidores de aplicativos possibilitam que aplicativos Ruby falem HTTP. Aplicativos Ruby (e frameworks como o Rails) não podem fazer isso sozinhos. Em uma pilha de produção típica, seria usado o Nginx ou o Apache como o servidor da Web, o Passenger como servidor de aplicativos, e o Capistrano como ferramenta de automação de lançamento. O Passenger integra-se ao Nginx ou ao Apache e gerencia o aplicativo e seus recursos. 56 | 57 | **INSTRUTOR(A)**: Às vezes você precisará especificar a versão da gem: `gem "passenger", ">= 5.0.25", require: "phusion_passenger/rack_handler"` 58 | 59 | #### Vamos checar se isso funcionou 60 | 61 | Execute o servidor Passenger com o seguinte comando: 62 | 63 | {% highlight sh %} 64 | bundle exec passenger start 65 | {% endhighlight %} 66 | 67 | O passageiro está veiculando seu aplicativo em http://0.0.0.0:3000/. 68 | Experimente e use um pouco seu aplicativo e execute "bundle exec passage-status" para verificar sua atividade. 69 | 70 | Existem duas maneiras de parar o servidor. O primeiro é pressionando Ctrl-C no terminal. A segunda maneira é executar `passenger stop` em uma nova janela de terminal: 71 | 72 | {% highlight sh %} 73 | cd /path-to-your-app 74 | bundle exec passenger stop 75 | {% endhighlight %} 76 | 77 | Quando você voltar para o primeiro terminal, você verá que o passageiro realmente parou. 78 | 79 | O passageiro reinicia processos que causam falhas, carregam o tráfego de balanceamento entre processos e dimensiona os processos para cima e para baixo, a fim de lidar com mais tráfego ou conservar recursos. Tudo isso é tratado automaticamente, sem que você precise especificar nada no seu código! Pode não fazer muito sentido agora, mas seu futuro desenvolvedor nos agradecerá. 80 | 81 | Para referência futura, você pode usar o comando `passenger-config restart-app` para reiniciar seu aplicativo. Isso é mais conveniente do que parar e iniciar o Passenger, que requer dois comandos. 82 | 83 | #### tmp/always_restart.txt 84 | 85 | O Passenger também suporta o arquivo mágico `tmp/always_restart.txt`. Com este arquivo, o Passenger irá reiniciar seu aplicativo após cada solicitação. Dessa forma, você não precisa invocar o comando de reinicialização com frequência. 86 | 87 | Ative este mecanismo criado o arquivo: 88 | 89 | {% highlight sh %} 90 | mkdir -p tmp 91 | touch tmp/always_restart.txt 92 | {% endhighlight %} 93 | 94 | Desative o mecanismo removendo o arquivo: 95 | 96 | {% highlight sh %} 97 | rm tmp/always_restart.txt 98 | {% endhighlight %} 99 | 100 | **INSTRUTOR(A)**: Às vezes a gem carrierwave gem causa problemas. Adicionando `require 'carrierwave/orm/activerecord'` ao arquivo `environment.rb` muitas vezes será suficiente. 101 | 102 | ### Implantando seu app 103 | 104 | #### Hospedando seu app 105 | 106 | Antes de selecionar seu host (infraestrutura) e [seguir o guia para colocar seu aplicativo on-line][passenger-guide], vamos confirmar as alterações que fizemos: 107 | 108 | {% highlight sh %} 109 | git add . 110 | git commit -m "add passenger" 111 | git push 112 | {% endhighlight %} 113 | 114 | Você também pode optar por seguir o [Heroku][heroku-guide] a parti daqui 115 | 116 | [passenger-guide]: https://www.phusionpassenger.com/library/walkthroughs/deploy/ruby/ 117 | [heroku-guide]: http://guides.railsgirls.com/heroku 118 | 119 | #### Solução de problemas 120 | 121 | Use o comando `passenger --help` em seu terminal para procurar todos os comandos disponíveis e sua funcionalidade.A maioria dos comandos (como `passenger start`) tem muitos 'sub-comandos'. Por exemple: execute `passenger start --help` para ver todos os complementos para o comando 'start'. 122 | 123 | Perdido? Phusion Passenger possui extensa documentação, incluindo guias para iniciantes: [Guia Passenger][passenger-documentation] 124 | 125 | No joelho? Rastejar através [Guia de solução de problemas do Passenger][troubleshooting-guide] com seu treinador. 126 | 127 | [passenger-documentation]: https://www.phusionpassenger.com/library/ 128 | [troubleshooting-guide]: https://www.phusionpassenger.com/library/admin/nginx/troubleshooting/ruby/ 129 | 130 | {% include other-guides.md page="passenger" %} 131 | -------------------------------------------------------------------------------- /_posts/2021-04-05-docker.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Docker com Ruby on Rails 4 | permalink: docker 5 | --- 6 | 7 | # Docker com Ruby on Rails 8 | *Escrito por [Hemershon Silva](https://hemershon.com/)* 9 | 10 | ## Como dockerizar sua aplicação 11 | 12 | Esse tutorial é para ajudar quem tem dificuldade em montar seu ambiente rails no docker, aqui vou abordar técnicas de como usar o docker e docker-compose que ambos trabalham em plena harmonia. 13 | 14 | **Resumo sobre o docker** 15 | 16 | Docker é um software contêiner da empresa Docker, Inc, que fornece uma camada de abstração e automação para virtualização de sistema operacional no Windows, Macos e Linux. 17 | 18 | Requisitos: 19 | 20 | Docker instalado na sua maquina [Instalação do docker](https://www.edivaldobrito.com.br/docker-no-ubuntu/) 21 | 22 | 23 | ## Definindo um projeto 24 | 25 | Comece configurando os arquivos necessários para construir o aplicativo que será executado dentro de um [contêiner](https://www.redhat.com/pt-br/topics/containers/what-is-docker) do Docker suas dependências. 26 | 27 | Os arquivos são: 28 | >Dockerfile 29 | 30 | >docker-compose.yml 31 | 32 | >Gemfile 33 | 34 | >Gemfile.lock 35 | 36 | Primeiro passo vamos criar o arquivo [Dockerfile](https://www.alura.com.br/artigos/desvendando-o-dockerfile) 37 | 38 | {% highlight yaml %} 39 | FROM ruby:3.0.0 40 | RUN apt-get update -qq && apt-get install -y nodejs postgresql-client 41 | RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ 42 | echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ 43 | apt-get update -qq && apt-get install -y nodejs postgresql-client vim && \ 44 | apt-get install -y yarn && \ 45 | apt-get install -y imagemagick && \ 46 | apt-get install -y libvips-tools && \ 47 | apt-get install -y locales 48 | 49 | # Instala nossas dependencias 50 | RUN apt-get update && apt-get install -qq -y --no-install-recommends \ 51 | nodejs yarn build-essential libpq-dev imagemagick git-all nano 52 | 53 | WORKDIR /seuapp 54 | COPY Gemfile /seuapp/Gemfile 55 | COPY Gemfile.lock /seuapp/Gemfile.lock 56 | RUN bundle update mimemagic 57 | RUN bundle install 58 | COPY . /seuapp 59 | {% endhighlight %} 60 | Isso colocará o código do seu aplicativo dentro de uma imagem que constrói um contêiner com Ruby, bundler e todas as suas dependências dentro dele. 61 | 62 | agora vamos criar o [Gemfile](https://jtemporal.com/gemfile/) 63 | 64 | {% highlight erb %} 65 | 66 | source 'https://rubygems.org' 67 | gem 'rails', '~>6' 68 | {% endhighlight %} 69 | 70 | como todo projeto rails precisamos também do Gemfile.lock 71 | {% highlight sh %} 72 | touch Gemfile.lock 73 | {% endhighlight %} 74 | 75 | [Docker-compose](https://imasters.com.br/banco-de-dados/docker-compose-o-que-e-para-que-serve-o-que-come#:~:text=Docker%20Compose%20%C3%A9%20o%20orquestrador,mas%20os%20maestros%20somos%20n%C3%B3s!) 76 | 77 | {% highlight yaml %} 78 | 79 | version: "3.9" 80 | services: 81 | db: 82 | image: postgres 83 | volumes: 84 | - ./tmp/db:/var/lib/postgresql/data 85 | environment: 86 | POSTGRES_PASSWORD: password 87 | web: 88 | build: . 89 | command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" 90 | volumes: 91 | - .:/seuapp 92 | ports: 93 | - "3000:3000" 94 | depends_on: 95 | - db 96 | {% endhighlight %} 97 | 98 | Agora vamos montar o projeto 99 | 100 | {% highlight sh %} 101 | docker-compose run --no-deps web rails new . --force --database=postgresql 102 | {% endhighlight %} 103 | 104 | Primeiro, o Compose cria a imagem para o webserviço usando o Dockerfile. O --no-deps diz ao Compose para não iniciar os serviços vinculados. Em seguida, ele é executado rails newdentro de um novo contêiner, usando essa imagem. Uma vez feito isso, você deve ter gerado um novo aplicativo. 105 | 106 | Você irá precisar de uma permissão para manipular os arquivos 107 | 108 | {% highlight sh %} 109 | sudo chown -R $USER:$USER . 110 | {% endhighlight %} 111 | 112 | Agora você está com a estrutura montada com todos os arquivos do rails, agora precisamos reconstruir a estrutura para usamos com o docker. 113 | 114 | {% highlight sh %} 115 | docker-compose build 116 | {% endhighlight %} 117 | 118 | Configurações de Banco de dados 119 | 120 | {% highlight yaml %} 121 | 122 | default: &default 123 | adapter: postgresql 124 | encoding: unicode 125 | host: db 126 | username: postgres 127 | password: password 128 | pool: 5 129 | 130 | development: 131 | <<: *default 132 | database: myapp_development 133 | 134 | 135 | test: 136 | <<: *default 137 | database: myapp_test 138 | {% endhighlight %} 139 | 140 | Agora você pode inicializar o aplicativo com 141 | 142 | {% highlight sh %} 143 | docker-compose up 144 | {% endhighlight %} 145 | 146 | se estiver tudo ok, essa é a mensagem que vai aparecer no terminal 147 | 148 | {% highlight sh %} 149 | 150 | rails_db_1 is up-to-date 151 | Creating rails_web_1 ... done 152 | Attaching to rails_db_1, rails_web_1 153 | db_1 | PostgreSQL init process complete; ready for start up. 154 | db_1 | 155 | db_1 | 2018-03-21 20:18:37.437 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 156 | db_1 | 2018-03-21 20:18:37.437 UTC [1] LOG: listening on IPv6 address "::", port 5432 157 | db_1 | 2018-03-21 20:18:37.443 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" 158 | db_1 | 2018-03-21 20:18:37.726 UTC [55] LOG: database system was shut down at 2018-03-21 20:18:37 UTC 159 | db_1 | 2018-03-21 20:18:37.772 UTC [1] LOG: database system is ready to accept connections 160 | {% endhighlight %} 161 | 162 | Agora vamos criar o banco de dados 163 | 164 | {% highlight sh %} 165 | 166 | docker-compose run web rake db:create 167 | {% endhighlight %} 168 | 169 | mensagem que vai aparecer 170 | 171 | {% highlight sh %} 172 | 173 | Starting rails_db_1... done 174 | Created database 'seuapp_development' 175 | Created database 'seuapp_test' 176 | {% endhighlight %} 177 | 178 | depois vá para o navegador e digite 179 | {% highlight sh %} 180 | 181 | localhost:3000 182 | {% endhighlight %} 183 | 184 | Referência estão nos links 185 | 186 | [O que é Docker](https://www.redhat.com/pt-br/topics/containers/what-is-docker) 187 | 188 | [Docker](https://docs.docker.com/get-docker/) 189 | 190 | [Docker-compose](https://imasters.com.br/banco-de-dados/docker-compose-o-que-e-para-que-serve-o-que-come#:~:text=Docker%20Compose%20%C3%A9%20o%20orquestrador,mas%20os%20maestros%20somos%20n%C3%B3s!) 191 | 192 | [Gemfile](https://jtemporal.com/gemfile/) 193 | 194 | [Dockerfile](https://www.alura.com.br/artigos/desvendando-o-dockerfile) 195 | -------------------------------------------------------------------------------- /css/code.css: -------------------------------------------------------------------------------- 1 | .highlight .hll { background-color: #ffffcc } 2 | /*.highlight { background: #f0f0f0; }*/ 3 | .highlight .c { color: #60a0b0; font-style: italic } /* Comment */ 4 | .highlight .err { border: 1px solid #FF0000 } /* Error */ 5 | .highlight .k { color: #007020; font-weight: bold } /* Keyword */ 6 | .highlight .o { color: #666666 } /* Operator */ 7 | .highlight .cm { color: #60a0b0; font-style: italic } /* Comment.Multiline */ 8 | .highlight .cp { color: #007020 } /* Comment.Preproc */ 9 | .highlight .c1 { color: #60a0b0; font-style: italic } /* Comment.Single */ 10 | .highlight .cs { color: #60a0b0; background-color: #fff0f0 } /* Comment.Special */ 11 | .highlight .gd { color: #A00000 } /* Generic.Deleted */ 12 | .highlight .ge { font-style: italic } /* Generic.Emph */ 13 | .highlight .gr { color: #FF0000 } /* Generic.Error */ 14 | .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 15 | .highlight .gi { color: #00A000 } /* Generic.Inserted */ 16 | .highlight .go { color: #808080 } /* Generic.Output */ 17 | .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ 18 | .highlight .gs { font-weight: bold } /* Generic.Strong */ 19 | .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 20 | .highlight .gt { color: #0040D0 } /* Generic.Traceback */ 21 | .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ 22 | .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ 23 | .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ 24 | .highlight .kp { color: #007020 } /* Keyword.Pseudo */ 25 | .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ 26 | .highlight .kt { color: #902000 } /* Keyword.Type */ 27 | .highlight .m { color: #40a070 } /* Literal.Number */ 28 | .highlight .s { color: #4070a0 } /* Literal.String */ 29 | .highlight .na { color: #4070a0 } /* Name.Attribute */ 30 | .highlight .nb { color: #007020 } /* Name.Builtin */ 31 | .highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ 32 | .highlight .no { color: #60add5 } /* Name.Constant */ 33 | .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ 34 | .highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ 35 | .highlight .ne { color: #007020 } /* Name.Exception */ 36 | .highlight .nf { color: #06287e } /* Name.Function */ 37 | .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ 38 | .highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ 39 | .highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ 40 | .highlight .nv { color: #bb60d5 } /* Name.Variable */ 41 | .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ 42 | .highlight .w { color: #bbbbbb } /* Text.Whitespace */ 43 | .highlight .mf { color: #40a070 } /* Literal.Number.Float */ 44 | .highlight .mh { color: #40a070 } /* Literal.Number.Hex */ 45 | .highlight .mi { color: #40a070 } /* Literal.Number.Integer */ 46 | .highlight .mo { color: #40a070 } /* Literal.Number.Oct */ 47 | .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ 48 | .highlight .sc { color: #4070a0 } /* Literal.String.Char */ 49 | .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ 50 | .highlight .s2 { color: #4070a0 } /* Literal.String.Double */ 51 | .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ 52 | .highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ 53 | .highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ 54 | .highlight .sx { color: #c65d09 } /* Literal.String.Other */ 55 | .highlight .sr { color: #235388 } /* Literal.String.Regex */ 56 | .highlight .s1 { color: #4070a0 } /* Literal.String.Single */ 57 | .highlight .ss { color: #517918 } /* Literal.String.Symbol */ 58 | .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ 59 | .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ 60 | .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ 61 | .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ 62 | .highlight .il { color: #40a070 } /* Literal.Number.Integer.Long */ 63 | -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | background: #f4f4f4; 3 | } 4 | 5 | body { 6 | margin: 0px; 7 | background: #fff; 8 | color: #333; 9 | text-rendering: optimizeLegibility; 10 | font-size: 15px; 11 | line-height: 1.6; 12 | } 13 | 14 | h1 { 15 | font-weight: normal; 16 | font-size: 3em; 17 | margin: 0.5em 0 1em; 18 | } 19 | 20 | h2 { 21 | font-weight: normal; 22 | font-size: 2em; 23 | margin: 1em 0 0.5em; 24 | } 25 | 26 | h2 em { 27 | position: absolute; 28 | display: inline-block; 29 | margin-left: -1.5em; 30 | font-style: normal; 31 | font-weight: bold; 32 | color: #ccc; 33 | } 34 | 35 | h3 { 36 | font-weight: normal; 37 | font-size: 1.5em; 38 | margin: 2em 0 0.8em; 39 | } 40 | 41 | h4 { 42 | font-size: 1.2em; 43 | margin: 2em 0 0.5em; 44 | } 45 | 46 | p { 47 | font-size: 16px; 48 | margin-bottom: 1em; 49 | line-height: 1.5; 50 | } 51 | 52 | ul li { 53 | margin-bottom: 0.5em; 54 | line-height: 1.5; 55 | } 56 | 57 | a { 58 | color: #e0330c; 59 | } 60 | 61 | a:hover { 62 | color: #e0330c; 63 | text-decoration: underline; 64 | } 65 | 66 | hr { 67 | border-top-color: #ddd; 68 | margin: 2em 0; 69 | } 70 | 71 | table { 72 | margin-bottom: 1em; 73 | } 74 | 75 | header { 76 | min-height: 70px; 77 | color: #fff; 78 | padding-top: 50px; 79 | background: #d3360b; 80 | } 81 | 82 | header #logo { 83 | width: 240px; 84 | float: left; 85 | } 86 | 87 | nav { 88 | margin: 0 0 0 250px; 89 | } 90 | 91 | nav a { 92 | color: #fff; 93 | text-decoration: none; 94 | font-weight: 300; 95 | font-size: 20px; 96 | letter-spacing: 1px; 97 | margin-left: 15px; 98 | } 99 | 100 | nav a:after { 101 | margin-left: 15px; 102 | content: url(../images/star.png); 103 | } 104 | 105 | nav a:last-child:after { 106 | content: none; 107 | } 108 | 109 | nav a:hover { 110 | text-decoration: underline; 111 | } 112 | 113 | footer { 114 | color: #666; 115 | overflow: hidden; 116 | width: 100%; 117 | padding: 40px 0; 118 | background: #f4f4f4; 119 | line-height: 1.5; 120 | text-align: center; 121 | } 122 | 123 | footer a { 124 | color: #111; 125 | border-color: #111; 126 | } 127 | 128 | .indent { 129 | margin-left: 70px; 130 | } 131 | 132 | .home { 133 | list-style: none; 134 | margin: 0; 135 | } 136 | 137 | .home li { 138 | padding: 1.5em 0; 139 | border-bottom: 1px solid #ddd; 140 | cursor: pointer; 141 | } 142 | 143 | .home li:last-child { 144 | border-bottom: 0; 145 | } 146 | 147 | .home li i { 148 | width: 70px; 149 | height: 70px; 150 | background-color: #d0d0d0; 151 | float: left; 152 | text-align: center; 153 | vertical-align: middle; 154 | font-size: 2em; 155 | color: #fff; 156 | line-height: 70px; 157 | font-style: normal; 158 | font-weight: bold; 159 | border-radius: 70px; 160 | transition: 0.1s background-color ease-in; 161 | -webkit-transition: 0.1s background-color ease-in; 162 | -moz-transition: 0.1s background-color ease-in; 163 | } 164 | 165 | .home li:hover i { 166 | background-color: #d3360b; 167 | transition: 0.1s background-color ease-in; 168 | -webkit-transition: 0.1s background-color ease-in; 169 | -moz-transition: 0.1s background-color ease-in; 170 | } 171 | 172 | .home li > a, 173 | .home li > a:hover { 174 | color: inherit; 175 | text-decoration: none; 176 | } 177 | 178 | .home h3 { 179 | margin: 0 0 0.5em; 180 | margin-left: 90px; 181 | color: #e0330c; 182 | } 183 | 184 | .home li:hover h3 { 185 | text-decoration: underline; 186 | } 187 | 188 | .home p { 189 | font-size: 18px; 190 | margin-left: 90px; 191 | } 192 | 193 | .hero-links em { 194 | margin: 0 0.8em; 195 | color: #999; 196 | } 197 | 198 | .hero-links { 199 | margin: 2em 0; 200 | } 201 | 202 | .hero { 203 | padding: 20px 320px 20px 0; 204 | background: url(../images/guides-hero.png) right 80px no-repeat; 205 | } 206 | 207 | i.icon-text-editor, 208 | i.icon-prompt, 209 | i.icon-browser { 210 | background-position: 0 0; 211 | margin-left: -70px; 212 | float: left; 213 | width: 50px; 214 | height: 50px; 215 | line-height: 50px; 216 | } 217 | i.icon-text-editor { 218 | background-image: url('/images/icon-text-editor.png'); 219 | } 220 | 221 | i.icon-prompt { 222 | background-image: url('/images/icon-prompt.png'); 223 | } 224 | 225 | i.icon-browser { 226 | background-image: url('/images/icon-browser.png'); 227 | } 228 | 229 | .highlight { 230 | margin-left: 30px; 231 | } 232 | 233 | .highlight pre { 234 | overflow-x: auto; 235 | } 236 | 237 | .highlight pre code { 238 | white-space: pre; 239 | } 240 | 241 | i.icon-small-text-editor, 242 | i.icon-small-prompt, 243 | i.icon-small-browser { 244 | background-position: 0 0; 245 | margin-left: 0px; 246 | margin-top: 15px; 247 | display: block; 248 | width: 50px; 249 | height: 20px; 250 | line-height: 20px; 251 | float: left; 252 | } 253 | i.icon-small-text-editor { 254 | background-image: url('/images/icon-small-text-editor.png'); 255 | } 256 | i.icon-small-prompt { 257 | background-image: url('/images/icon-small-prompt.png'); 258 | } 259 | i.icon-small-browser { 260 | background-image: url('/images/icon-small-browser.png'); 261 | } 262 | 263 | .os-specific { 264 | margin-bottom: 4em; 265 | } 266 | 267 | .os-specific .picker { 268 | display: block; 269 | float: right; 270 | } 271 | 272 | .os-specific .active { 273 | font-weight: bold; 274 | } 275 | 276 | /* Correct padding on smaller screens */ 277 | @media (max-width: 767px) { 278 | header, 279 | footer { 280 | margin-left: -20px; 281 | margin-right: -20px; 282 | padding-left: 20px; 283 | padding-right: 20px; 284 | } 285 | } 286 | 287 | /* Don't show the homepage image on mobile */ 288 | @media (max-width: 480px) { 289 | .hero { 290 | padding: 20px 0; 291 | background: none; 292 | } 293 | } 294 | 295 | kbd { 296 | padding: 0.1em 0.6em; 297 | border: 1px solid #ccc; 298 | font-size: 11px; 299 | font-family: Arial, Helvetica, sans-serif; 300 | background-color: #f7f7f7; 301 | color: #333; 302 | -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px #fff inset; 303 | -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px #fff inset; 304 | box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px #fff inset; 305 | border-radius: 3px; 306 | display: inline-block; 307 | margin: 0 0.1em; 308 | text-shadow: 0 1px 0 #fff; 309 | line-height: 1.5em; 310 | white-space: nowrap; 311 | } 312 | 313 | .github-corner:hover .octo-arm { 314 | animation: octocat-wave 560ms ease-in-out; 315 | } 316 | 317 | @keyframes octocat-wave { 318 | 0%, 319 | 100% { 320 | transform: rotate(0); 321 | } 322 | 20%, 323 | 60% { 324 | transform: rotate(-25deg); 325 | } 326 | 40%, 327 | 80% { 328 | transform: rotate(10deg); 329 | } 330 | } 331 | 332 | @media (max-width: 500px) { 333 | .github-corner:hover .octo-arm { 334 | animation: none; 335 | } 336 | .github-corner .octo-arm { 337 | animation: octocat-wave 560ms ease-in-out; 338 | } 339 | } 340 | 341 | 342 | .navbar .brand { 343 | height: 24px; 344 | line-height: 24px; 345 | font-size: 22px; 346 | font-weight: 400; 347 | color: #fff; 348 | text-shadow: none; 349 | } 350 | 351 | .navbar .btn-navbar { 352 | display: block; 353 | float: left; 354 | height: 24px; 355 | padding: 7px 10px; 356 | margin-right: 5px; 357 | margin-left: 5px; 358 | color: #ffffff; 359 | text-shadow: none; 360 | background-color: inherit; 361 | border: none; 362 | box-shadow: none; 363 | background-image: none; 364 | } 365 | 366 | .navbar .btn-navbar:hover, 367 | .navbar .btn-navbar:focus, 368 | .navbar .btn-navbar:active, 369 | .navbar .btn-navbar.active, 370 | .navbar .btn-navbar.disabled, 371 | .navbar .btn-navbar[disabled] { 372 | color: #ffffff; 373 | background-color: inherit; 374 | *background-color: inherit; 375 | } 376 | 377 | .navbar .btn-navbar .icon-bar { 378 | display: block; 379 | width: 18px; 380 | height: 4px; 381 | background-color: #fff; 382 | box-shadow: none; 383 | } 384 | 385 | .navbar .nav > li > a { 386 | float: none; 387 | color: #fff; 388 | font-weight: 400; 389 | text-decoration: none; 390 | text-shadow: none; 391 | } 392 | 393 | .navbar .nav > li > a:focus, 394 | .navbar .nav > li > a:hover, 395 | nav a:hover { 396 | color: #f6e58d; 397 | text-decoration: none; 398 | background-color: transparent; 399 | } -------------------------------------------------------------------------------- /favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/favicon.png -------------------------------------------------------------------------------- /images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/1.png -------------------------------------------------------------------------------- /images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/2.png -------------------------------------------------------------------------------- /images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/3.png -------------------------------------------------------------------------------- /images/butterfly_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/butterfly_login.png -------------------------------------------------------------------------------- /images/chrome-confirm-resubmission.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/chrome-confirm-resubmission.png -------------------------------------------------------------------------------- /images/chrome-post-redirect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/chrome-post-redirect.png -------------------------------------------------------------------------------- /images/cloneordownload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/cloneordownload.png -------------------------------------------------------------------------------- /images/codenvy/create-account.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/codenvy/create-account.jpg -------------------------------------------------------------------------------- /images/codenvy/create-workspace-dashboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/codenvy/create-workspace-dashboard.jpg -------------------------------------------------------------------------------- /images/codenvy/create-workspace.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/codenvy/create-workspace.jpg -------------------------------------------------------------------------------- /images/codenvy/get-workspace-ip.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/codenvy/get-workspace-ip.jpg -------------------------------------------------------------------------------- /images/codenvy/start-workspace.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/codenvy/start-workspace.jpg -------------------------------------------------------------------------------- /images/coffee-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/coffee-app.png -------------------------------------------------------------------------------- /images/complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/complete.png -------------------------------------------------------------------------------- /images/fork1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/fork1.jpg -------------------------------------------------------------------------------- /images/guides-hero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/guides-hero.png -------------------------------------------------------------------------------- /images/icon-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/icon-app.png -------------------------------------------------------------------------------- /images/icon-browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/icon-browser.png -------------------------------------------------------------------------------- /images/icon-prompt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/icon-prompt.png -------------------------------------------------------------------------------- /images/icon-small-browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/icon-small-browser.png -------------------------------------------------------------------------------- /images/icon-small-prompt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/icon-small-prompt.png -------------------------------------------------------------------------------- /images/icon-small-text-editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/icon-small-text-editor.png -------------------------------------------------------------------------------- /images/icon-text-editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/icon-text-editor.png -------------------------------------------------------------------------------- /images/pull_request.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/pull_request.png -------------------------------------------------------------------------------- /images/railsgirls-guides-portugues.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/railsgirls-guides-portugues.png -------------------------------------------------------------------------------- /images/railsgirls-guides.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/railsgirls-guides.png -------------------------------------------------------------------------------- /images/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/star.png -------------------------------------------------------------------------------- /images/url-breakdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/url-breakdown.png -------------------------------------------------------------------------------- /images/virtualbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/railsgirls/guides-ptbr/2591bc5d14f187b80ea58003cec1e9c8d9025f02/images/virtualbox.png -------------------------------------------------------------------------------- /js/guides.js: -------------------------------------------------------------------------------- 1 | function saveOs(os) { 2 | $.cookie("os", os, { expires: 1825, path: '/' }); // expires in 5 years 3 | } 4 | 5 | function loadOs() { 6 | var osFromCookie = $.cookie("os"); 7 | if(osFromCookie) { 8 | $(".os-specific").find("." + osFromCookie + "-link").click(); 9 | } else if(detectOs()) { 10 | $(".os-specific").find("." + detectOs() + "-link").click(); 11 | } else { 12 | $(".os-specific").find(".win-link").click(); 13 | } 14 | return osFromCookie; 15 | } 16 | 17 | function detectOs() { 18 | try { 19 | if (navigator.appVersion.match(/Win/i)) { 20 | return "win"; 21 | } else { 22 | return "nix"; 23 | } 24 | } catch(e) { 25 | return false; 26 | } 27 | } 28 | 29 | function addIcons() { 30 | $("code.language-sh, code.language-bat").closest('.highlight').before(''); 31 | $("code.language-erb, code.language-html, code.language-ruby, code.language-css").closest('.highlight').before(''); 32 | $("code.language-browser").closest('.highlight').before(''); 33 | } 34 | 35 | function initializeOsSwitchers() { 36 | $(".os-specific").append("Escolha seu sistema operacional: Windows | Outro").find(".win-link").click(function(event) { 37 | event.preventDefault(); 38 | saveOs("win"); 39 | 40 | $(".os-specific .win-link").addClass("active").siblings().removeClass("active"); 41 | $(".os-specific").children("div").hide().filter(".win").show(); 42 | }).end().find(".nix-link").click(function(event) { 43 | event.preventDefault(); 44 | saveOs("nix"); 45 | 46 | $(".os-specific .nix-link").addClass("active").siblings().removeClass("active"); 47 | $(".os-specific").children("div").hide().filter(".nix").show(); 48 | }); 49 | } 50 | 51 | $(document).ready(function() { 52 | addIcons(); 53 | initializeOsSwitchers(); 54 | loadOs(); 55 | }); 56 | -------------------------------------------------------------------------------- /js/jquery.cookie.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Cookie Plugin v1.3.1 3 | * https://github.com/carhartl/jquery-cookie 4 | * 5 | * Copyright 2013 Klaus Hartl 6 | * Released under the MIT license 7 | */ 8 | (function (factory) { 9 | if (typeof define === 'function' && define.amd) { 10 | // AMD. Register as anonymous module. 11 | define(['jquery'], factory); 12 | } else { 13 | // Browser globals. 14 | factory(jQuery); 15 | } 16 | }(function ($) { 17 | 18 | var pluses = /\+/g; 19 | 20 | function raw(s) { 21 | return s; 22 | } 23 | 24 | function decoded(s) { 25 | return decodeURIComponent(s.replace(pluses, ' ')); 26 | } 27 | 28 | function converted(s) { 29 | if (s.indexOf('"') === 0) { 30 | // This is a quoted cookie as according to RFC2068, unescape 31 | s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); 32 | } 33 | try { 34 | return config.json ? JSON.parse(s) : s; 35 | } catch(er) {} 36 | } 37 | 38 | var config = $.cookie = function (key, value, options) { 39 | 40 | // write 41 | if (value !== undefined) { 42 | options = $.extend({}, config.defaults, options); 43 | 44 | if (typeof options.expires === 'number') { 45 | var days = options.expires, t = options.expires = new Date(); 46 | t.setDate(t.getDate() + days); 47 | } 48 | 49 | value = config.json ? JSON.stringify(value) : String(value); 50 | 51 | return (document.cookie = [ 52 | config.raw ? key : encodeURIComponent(key), 53 | '=', 54 | config.raw ? value : encodeURIComponent(value), 55 | options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE 56 | options.path ? '; path=' + options.path : '', 57 | options.domain ? '; domain=' + options.domain : '', 58 | options.secure ? '; secure' : '' 59 | ].join('')); 60 | } 61 | 62 | // read 63 | var decode = config.raw ? raw : decoded; 64 | var cookies = document.cookie.split('; '); 65 | var result = key ? undefined : {}; 66 | for (var i = 0, l = cookies.length; i < l; i++) { 67 | var parts = cookies[i].split('='); 68 | var name = decode(parts.shift()); 69 | var cookie = decode(parts.join('=')); 70 | 71 | if (key && key === name) { 72 | result = converted(cookie); 73 | break; 74 | } 75 | 76 | if (!key) { 77 | result[name] = converted(cookie); 78 | } 79 | } 80 | 81 | return result; 82 | }; 83 | 84 | config.defaults = {}; 85 | 86 | $.removeCookie = function (key, options) { 87 | if ($.cookie(key) !== undefined) { 88 | // Must not alter options, thus extending a fresh object... 89 | $.cookie(key, '', $.extend({}, options, { expires: -1 })); 90 | return true; 91 | } 92 | return false; 93 | }; 94 | 95 | })); 96 | -------------------------------------------------------------------------------- /js/mobile-menu.js: -------------------------------------------------------------------------------- 1 | function toggleMobileMenu() { 2 | var navbarList = document.getElementById("navbar-list"); 3 | if (navbarList.style.height === "auto") { 4 | navbarList.style.height = "0"; 5 | } else { 6 | navbarList.style.height = "auto"; 7 | } 8 | } -------------------------------------------------------------------------------- /js/prefixfree.min.js: -------------------------------------------------------------------------------- 1 | // StyleFix 1.0.2 + PrefixFree 1.0.6 / Lea Verou / MIT license 2 | (function(){function h(a,b){return[].slice.call((b||document).querySelectorAll(a))}if(window.addEventListener){var e=window.StyleFix={link:function(a){try{if("stylesheet"!==a.rel||a.hasAttribute("data-noprefix"))return}catch(b){return}var c=a.href||a.getAttribute("data-href"),f=c.replace(/[^\/]+$/,""),i=a.parentNode,d=new XMLHttpRequest,g;d.onreadystatechange=function(){4===d.readyState&&g()};g=function(){var b=d.responseText;if(b&&a.parentNode&&(!d.status||400>d.status||600