├── .gitignore ├── .ruby-version ├── Gemfile ├── Gemfile.lock ├── README ├── _config.yml ├── _css └── tailwind.css ├── _includes ├── book_cta.html ├── disqus.html ├── footer.html ├── header.html ├── nav.html ├── referrals.html ├── sidebar.html └── social.html ├── _layouts ├── default.html ├── main.html ├── post.html ├── tags.html └── wide.html ├── _plugins └── ext.rb ├── _posts ├── 2010-05-19-bootstrapping-a-rails-app.markdown ├── 2010-05-22-bootstrapping-rails-template.markdown ├── 2010-05-25-nifty-generators.markdown ├── 2010-05-27-nifty-config.markdown ├── 2010-06-01-nifty-scaffold.markdown ├── 2010-06-03-ruby-toolbox.markdown ├── 2010-06-06-rails-authentication-options.markdown ├── 2010-06-08-hacking-restful-authentication.markdown ├── 2010-06-10-rails-footnotes.markdown ├── 2010-06-16-authorization-restful-acl-1.markdown ├── 2010-06-19-rails-template-generator.markdown ├── 2010-06-21-authorization-restful-acl-2.markdown ├── 2010-06-24-authorization-restful-acl-3.markdown ├── 2010-06-28-rvm-gemsets-rails3.markdown ├── 2010-07-05-intermediate-rails-steps.markdown ├── 2010-07-08-authenticated-attachments-paperclip-rails.markdown ├── 2010-07-13-nested-routes-controllers.markdown ├── 2010-07-18-understanding-rest-and-routes.markdown ├── 2010-07-23-rails-command-line.markdown ├── 2010-07-28-free-ruby-rails-books.markdown ├── 2010-07-30-nifty-generators-rails-3.markdown ├── 2010-08-04-more-free-ruby-rails-books.markdown ├── 2010-08-11-ruby-date-time-parsing-chronic.markdown ├── 2010-08-22-mobile-rails-1.markdown ├── 2010-08-29-mobile-rails-2.markdown ├── 2010-09-13-rvm-project-gemsets.markdown ├── 2010-09-27-rails-refactoring-tools.markdown ├── 2010-10-16-rails-documentation-tools.markdown ├── 2010-11-09-jquery-mobile-rails-devise.markdown ├── 2010-11-16-rails-ancestry-tree.markdown ├── 2010-12-07-clean-urls-seo-rails.markdown ├── 2010-12-17-rails-admin-panel.markdown ├── 2011-01-11-beginning-rails-testing.markdown ├── 2011-01-19-learning-ruby-rails.markdown ├── 2011-01-25-passenger-3-rvm.markdown ├── 2011-02-28-rails-3-application-templates.markdown ├── 2011-03-11-rails-obfuscated-urls-friendly-id.markdown ├── 2011-04-03-simple-rails-project-backups.markdown ├── 2011-04-28-rails-try-method.markdown ├── 2011-05-08-rails-3.1-beta-rvm.markdown ├── 2011-05-26-rails-smtp-development.markdown ├── 2011-06-16-rails-form-cancel-links.markdown ├── 2011-09-07-rails-contact-form.markdown ├── 2011-09-16-rails-legacy-data-migration-trucker.markdown ├── 2011-09-21-rails-authentication.markdown ├── 2011-10-06-rails-authorization.markdown ├── 2011-11-11-active-admin.markdown ├── 2011-12-11-legacy-data-migrations-rails.markdown ├── 2012-03-12-testing-series-intro.markdown ├── 2012-03-12-testing-series-rspec-setup.markdown ├── 2012-03-19-testing-series-rspec-models-factory-girl.markdown ├── 2012-04-07-testing-series-rspec-controllers.markdown ├── 2012-04-24-testing-series-rspec-requests.markdown ├── 2012-05-07-everyday-rails-rspec-book-available.markdown ├── 2012-05-15-rspec-book-update.markdown ├── 2012-06-13-rspec-book-complete.markdown ├── 2012-07-31-rails-admin-panel-from-scratch.markdown ├── 2012-08-03-rspec-book-updates.markdown ├── 2012-08-07-rails-admin-panel-from-scratch-2.markdown ├── 2012-08-19-rails-admin-panel-from-scratch-3.markdown.markdown ├── 2012-09-11-bundler-rails-specify-versions.markdown ├── 2012-11-14-rspec-book-news.markdown ├── 2013-02-13-rspec-book-updates-capybara.markdown ├── 2013-03-21-rails-rescue-1-setup.markdown ├── 2013-04-16-rails-rescue-2-testing.markdown ├── 2013-04-24-rspec-book-updates.markdown ├── 2013-05-20-obfuscated-data-screenshots.markdown ├── 2013-07-16-july-2013-book-updates.markdown ├── 2013-08-21-rspec-book-rails-4-final-release-notes.markdown ├── 2013-09-09-rspec-book-chinese-translation.markdown ├── 2013-11-15-i-wrote-a-view-spec.markdown ├── 2014-01-15-outside-in-example-ruby-tapas.markdown ├── 2014-01-25-rspec-rails-3-2-edition-free-extra.markdown ├── 2014-02-08-everyday-rails-rspec-japanese.markdown ├── 2014-02-27-git-reset-clean.markdown ├── 2014-04-03-rspec-book-updates-spring-2014.markdown ├── 2014-10-05-rspec-3-book-update.markdown ├── 2014-12-23-simple-data-dump-restore-yamldb.markdown ├── 2015-01-27-rspec-switch-selenium-poltergeist.markdown ├── 2015-02-17-pronto-ruby-code-review.markdown ├── 2015-04-05-rspec-assigns-rails-testing.markdown ├── 2015-07-29-deep-cloning.markdown ├── 2015-08-09-redesign-2015-notes.markdown ├── 2015-08-27-atom-package-rspec.markdown ├── 2016-01-23-clearance-rails-authentication.markdown ├── 2016-04-18-rails-documentation-practices.markdown ├── 2016-08-29-replace-rspec-controller-tests.markdown ├── 2016-09-05-replace-rspec-controller-tests.markdown ├── 2016-12-05-rspec-book-rails-5.markdown ├── 2016-12-12-rails-security-essentials.markdown ├── 2017-01-02-git-command-line-log-search.markdown ├── 2017-01-09-rails-https-only-lets-encrypt-ssl.markdown ├── 2017-01-16-code-review-mindset.markdown ├── 2017-01-23-your-rails-code-base.markdown ├── 2017-02-20-book-status-report-february-2017.markdown ├── 2017-03-01-rails-5-app-documentation.markdown ├── 2017-06-20-rspec-book-2017-updates.markdown ├── 2017-10-19-rspec-book-2017-complete.markdown ├── 2017-11-20-replace-rspec-controller-tests.markdown ├── 2017-12-18-ruby-upgrade-guide-for-rails.markdown ├── 2018-01-08-rspec-3.7-system-tests.markdown ├── 2018-03-23-rails-spec-coverage-simplecov.markdown ├── 2018-04-21-rspec-book-status-spring-2018.markdown ├── 2018-06-11-bundler-shortcuts.markdown ├── 2018-07-18-ruby-podcasts.markdown ├── 2018-08-22-rspec-book-updates-august-2018.markdown ├── 2019-02-18-rails-sql-requirements.markdown ├── 2019-04-09-chromedriver-helper-webdrivers.markdown ├── 2019-07-09-when-tdd-is-hard.markdown ├── 2020-04-15-rspec-book-price-changes.markdown ├── 2020-05-11-working-with-legacy-rails-application.markdown ├── 2020-05-18-everyday-rails-10th-birthday.markdown ├── 2020-05-25-newsletters-for-rails-developers.markdown ├── 2020-06-08-rspec-retry-intermittent-failures.markdown ├── 2020-06-22-rails-routes-helpers-grammar.markdown ├── 2020-07-06-modular-rails-templates-rails-bytes.markdown ├── 2020-08-10-rails-log-message-testing-rspec.markdown ├── 2020-08-24-deliberate-learning-1.markdown ├── 2020-09-17-redesign-2020-notes.markdown ├── 2020-09-20-command-line-alternatives.markdown ├── 2020-12-03-plausible-analytics.markdown ├── 2021-02-14-docker-devcontainer-series-intro.markdown ├── 2021-02-21-docker-devcontainer-series-setup.markdown ├── 2021-02-28-rails-db-setup-persist-data.markdown ├── 2021-03-07-docker-devcontainer-series-database-sqlite.markdown ├── 2021-03-14-docker-devcontainer-series-docker-compose.markdown ├── 2021-04-05-rspec-tutorial-mimemagic-fix.markdown ├── 2021-05-29-pronto-github-actions-code-quality.markdown ├── 2021-07-31-rails-custom-deprecation-warnings.markdown ├── 2023-06-26-rails-tdd-copilot-chatgpt.markdown ├── 2023-09-05-dev-containers-best-practices.markdown ├── 2023-12-07-rspec-resilient-matchers.markdown ├── 2024-01-14-github-actions-devcontainer-ci.markdown ├── 2024-02-06-rspec-book-announcement-rails-7-1.markdown ├── 2024-02-24-rails-just-commands.markdown ├── 2024-03-13-migrate-minitest-to-rspec-copilot.markdown ├── 2024-05-04-rspec-book-status-may-2024.markdown ├── 2024-05-20-railsconf-book-discount-2024.markdown ├── 2024-06-01-replacing-system-tests-with-unit-tests.markdown ├── 2024-07-21-rspec-book-july-2024-announcement.markdown ├── 2024-09-04-rspec-book-september-2024-announcement.markdown ├── 2024-10-10-rspec-book-october-2024-announcement.markdown ├── 2024-11-26-rspec-book-november-2024.markdown ├── 2024-12-29-rspec-book-december-2024-announcement.markdown ├── 2025-01-07-aider-ai-dev-container.markdown ├── 2025-03-09-dotfiles-gh-extensions.md ├── 2025-04-05-rspec-book-april-2025-announcement.md ├── 2025-04-15-old-ruby-rails-dev-container.md └── 2025-05-18-happy-birthday.md ├── about.markdown ├── apple-icon-114x114-precomposed.png ├── apple-icon-144x144-precomposed.png ├── apple-icon-57x57-precomposed.png ├── apple-icon-72x72-precomposed.png ├── archives.html ├── atom.xml ├── blm.markdown ├── config.rb ├── contact.html ├── css └── tomorrow-night.css ├── images ├── banner.png ├── box.png ├── ccheart_black.svg ├── hover.png ├── linode.png ├── logo-2020.svg ├── logo-small.png ├── logo-square.png ├── mug2022.jpg ├── posts │ ├── astoria-sunset.jpg │ ├── atom-header.jpg │ ├── brakeman.png │ ├── docker │ │ ├── boxes.jpg │ │ └── ruby-box.jpg │ ├── git-log-header-large.jpg │ ├── hacker-cat.jpg │ ├── legacy-intro-header.jpg │ ├── letsencrypt-logo-horizontal.svg │ ├── pronto-github-actions.png │ ├── sad-mac.png │ ├── simplecov-header.jpg │ └── thumbs-up.jpg ├── rspec-book-2024-xl.jpg ├── rspec-book-xl.jpg ├── rspec_book.jpg ├── rspec_book_large.jpg └── rspec_book_med.jpg ├── img ├── glyphicons-halflings-white.png └── glyphicons-halflings.png ├── index.html ├── js ├── bootstrap.js ├── bootstrap.min.js ├── jquery.min.js └── npm.js ├── justfile ├── mise.toml ├── missing.markdown ├── package-lock.json ├── package.json ├── postcss.config.js ├── rspecbook ├── code.zip ├── everydayrailsrspec-5.1.zip └── index.markdown ├── tailwind.config.js └── thanks.html /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | _site/* 3 | .sass-cache/* 4 | .rvmrc 5 | _tasks/deploy 6 | .rvmrc 7 | googlehostedservice.html 8 | ads.html 9 | bottom_ads.html 10 | _drafts/* 11 | node_modules/* 12 | tmp/* 13 | css/tailwind.css 14 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | ruby-3.1.6 2 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "jekyll", "~> 4.4" 4 | gem "rouge" 5 | gem "kramdown-parser-gfm" 6 | gem "webrick" 7 | 8 | group :jekyll_plugins do 9 | gem "jekyll-tagging", 10 | git: "https://github.com/everydayrails/jekyll-tagging", 11 | branch: "allow-posts-with-no-tags" 12 | gem "jekyll-gist" 13 | end 14 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GIT 2 | remote: https://github.com/everydayrails/jekyll-tagging 3 | revision: 46dd035ae0c6bfa4cd2b123e139db9fe04a10721 4 | branch: allow-posts-with-no-tags 5 | specs: 6 | jekyll-tagging (1.1.0) 7 | nuggets 8 | 9 | GEM 10 | remote: https://rubygems.org/ 11 | specs: 12 | addressable (2.5.2) 13 | public_suffix (>= 2.0.2, < 4.0) 14 | base64 (0.2.0) 15 | bigdecimal (3.1.9) 16 | colorator (1.1.0) 17 | concurrent-ruby (1.3.5) 18 | csv (3.3.2) 19 | em-websocket (0.5.3) 20 | eventmachine (>= 0.12.9) 21 | http_parser.rb (~> 0) 22 | eventmachine (1.2.7) 23 | faraday (0.17.6) 24 | multipart-post (>= 1.2, < 3) 25 | ffi (1.17.1) 26 | forwardable-extended (2.6.0) 27 | google-protobuf (4.29.3) 28 | bigdecimal 29 | rake (>= 13) 30 | http_parser.rb (0.8.0) 31 | i18n (1.14.7) 32 | concurrent-ruby (~> 1.0) 33 | jekyll (4.4.1) 34 | addressable (~> 2.4) 35 | base64 (~> 0.2) 36 | colorator (~> 1.0) 37 | csv (~> 3.0) 38 | em-websocket (~> 0.5) 39 | i18n (~> 1.0) 40 | jekyll-sass-converter (>= 2.0, < 4.0) 41 | jekyll-watch (~> 2.0) 42 | json (~> 2.6) 43 | kramdown (~> 2.3, >= 2.3.1) 44 | kramdown-parser-gfm (~> 1.0) 45 | liquid (~> 4.0) 46 | mercenary (~> 0.3, >= 0.3.6) 47 | pathutil (~> 0.9) 48 | rouge (>= 3.0, < 5.0) 49 | safe_yaml (~> 1.0) 50 | terminal-table (>= 1.8, < 4.0) 51 | webrick (~> 1.7) 52 | jekyll-gist (1.5.0) 53 | octokit (~> 4.2) 54 | jekyll-sass-converter (3.1.0) 55 | sass-embedded (~> 1.75) 56 | jekyll-watch (2.2.1) 57 | listen (~> 3.0) 58 | json (2.9.1) 59 | kramdown (2.3.1) 60 | rexml 61 | kramdown-parser-gfm (1.1.0) 62 | kramdown (~> 2.0) 63 | liquid (4.0.4) 64 | listen (3.9.0) 65 | rb-fsevent (~> 0.10, >= 0.10.3) 66 | rb-inotify (~> 0.9, >= 0.9.10) 67 | mercenary (0.4.0) 68 | multipart-post (2.3.0) 69 | nuggets (1.6.0) 70 | octokit (4.9.0) 71 | sawyer (~> 0.8.0, >= 0.5.3) 72 | pathutil (0.16.2) 73 | forwardable-extended (~> 2.6) 74 | public_suffix (3.1.1) 75 | rake (13.2.1) 76 | rb-fsevent (0.11.2) 77 | rb-inotify (0.11.1) 78 | ffi (~> 1.0) 79 | rexml (3.2.5) 80 | rouge (3.27.0) 81 | safe_yaml (1.0.5) 82 | sass-embedded (1.83.4) 83 | google-protobuf (~> 4.29) 84 | rake (>= 13) 85 | sawyer (0.8.1) 86 | addressable (>= 2.3.5, < 2.6) 87 | faraday (~> 0.8, < 1.0) 88 | terminal-table (3.0.2) 89 | unicode-display_width (>= 1.1.1, < 3) 90 | unicode-display_width (2.6.0) 91 | webrick (1.8.1) 92 | 93 | PLATFORMS 94 | ruby 95 | 96 | DEPENDENCIES 97 | jekyll (~> 4.4) 98 | jekyll-gist 99 | jekyll-tagging! 100 | kramdown-parser-gfm 101 | rouge 102 | webrick 103 | 104 | BUNDLED WITH 105 | 2.2.33 106 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | Everyday Rails is a blog about getting stuff done with Ruby on Rails. This 2 | is the source code for the blog, which is created with the Jekyll static 3 | site framework/generator. 4 | 5 | ## CSS 6 | 7 | CSS is build using Tailwind CSS, with some overriding layers to handle tags 8 | generated by the Jekyll CMS layer outlined in `tailwind.config.js`. Rebuild 9 | CSS after editing Tailwind configs by running 10 | 11 | ``` 12 | npm run build 13 | ``` 14 | 15 | In production, unused Tailwind styles are purged as part of the Netlify build 16 | process (`NODE_ENV=production npm run build && jekyll build`). 17 | 18 | Copyright (c) 2010 Aaron Sumner 19 | 20 | Permission is hereby granted, free of charge, to any person obtaining a copy 21 | of this software and associated documentation files (the "Software"), to deal 22 | in the Software without restriction, including without limitation the rights 23 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 24 | copies of the Software, and to permit persons to whom the Software is 25 | furnished to do so, subject to the following conditions: 26 | 27 | The above copyright notice and this permission notice shall be included in 28 | all copies or substantial portions of the Software. 29 | 30 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 31 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 32 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 33 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 34 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 35 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 36 | THE SOFTWARE. 37 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | destination: ./_site 2 | lsi: false 3 | port: 4000 4 | markdown: kramdown 5 | highlighter: rouge 6 | kramdown: 7 | input: GFM 8 | syntax_highlighter_opts: 9 | default_lang: html 10 | css_class: "highlight" 11 | permalink: date 12 | feed: http://feeds.feedburner.com/EverydayRails 13 | twitter: http://twitter.com/everydayrails 14 | facebook: http://facebook.com/everydayrails 15 | exclude: 16 | [ 17 | node_modules, 18 | scss, 19 | tmp, 20 | .ruby-version, 21 | Gemfile, 22 | Gemfile.lock, 23 | drafts, 24 | public, 25 | src, 26 | mise.toml, 27 | ] 28 | tag_page_layout: tags 29 | tag_page_dir: tag 30 | plugins: [jekyll-gist] 31 | -------------------------------------------------------------------------------- /_css/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer base { 6 | h1 { 7 | @apply text-4xl font-semibold mt-10; 8 | } 9 | 10 | h2 { 11 | @apply text-xl font-semibold mt-10; 12 | } 13 | 14 | h3 { 15 | @apply text-lg font-semibold mt-10; 16 | } 17 | 18 | h4 { 19 | @apply font-semibold; 20 | } 21 | 22 | p { 23 | @apply mt-5; 24 | } 25 | 26 | a { 27 | @apply text-red-900 underline; 28 | } 29 | 30 | pre { 31 | @apply my-5 p-3 bg-gray-800 text-gray-200 rounded overflow-scroll; 32 | } 33 | 34 | ul { 35 | @apply list-disc my-5; 36 | } 37 | 38 | ol { 39 | @apply list-decimal my-5; 40 | } 41 | 42 | li { 43 | @apply my-2 ml-5; 44 | } 45 | 46 | blockquote { 47 | @apply p-5 text-gray-800 mt-3 mb-3; 48 | } 49 | 50 | #tags a { 51 | @apply pr-3; 52 | } 53 | 54 | .decoration { 55 | @apply float-right; 56 | } 57 | 58 | .alert { 59 | @apply mt-5 p-5 rounded-lg; 60 | } 61 | 62 | .alert p:first-child { 63 | @apply mt-0; 64 | } 65 | 66 | .alert ul:last-child { 67 | @apply mt-0; 68 | } 69 | 70 | .alert-info { 71 | @apply bg-green-200 text-green-800; 72 | } 73 | 74 | .alert-danger { 75 | @apply bg-red-200 text-red-800; 76 | } 77 | 78 | .alert-warning { 79 | @apply bg-orange-100 text-orange-800; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /_includes/book_cta.html: -------------------------------------------------------------------------------- 1 |
5 | Learn to test Rails apps the way 6 | I learned, building up tests step-by-step, in 7 | Everyday Rails Testing 8 | with RSpec. 9 | Expanded to include exclusive content and a complete sample Rails application. 10 | 11 | Learn more » 12 |
13 |5 | Do me a favor and support these great companies. Sign up through these 6 | links to help keep Everyday Rails going. Thanks for your support. 7 |
8 | 9 |
10 |
11 | Linode
12 | is my preferred cloud hosting provider for Everyday Rails and other
13 | projects. Fast, SSD-based servers, great uptime, and awesome tooling and
14 | support.
15 |
18 |
19 | I use Hover for my
20 | domain name registry and DNS management. They're simple, affordable,
21 | reliable, and ethical.
22 |
7 | If you liked my series on practical advice for adding reliable tests to 8 | your Rails apps, check out the expanded ebook version. Lots of 9 | additional, exclusive content and a complete sample Rails application. 10 |
11 |21 | Ruby on Rails news and tips, and other ideas and surprises from Aaron at 22 | Everyday Rails. Delivered to your inbox on no particular set schedule. 23 |
24 |