56,966 blogs · [ { "id": "01a08757-acdb-73ac-b906-f94d18eafdba", "title": "Beautiful Rails confirmation dialogs (with zero JavaScript)", "url": "https://boringrails.com/articles/data-turbo-confirm-beautiful-dialog/", "published_at": "2025-12-15T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d1998b8fd", "title": "Hotwire components that refresh themselves", "url": "https://boringrails.com/articles/self-updating-components/", "published_at": "2025-07-07T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d1a5da950", "title": "Event sourcing for smooth brains: building a basic event-driven system in Rails", "url": "https://boringrails.com/articles/event-sourcing-for-smooth-brains/", "published_at": "2024-07-21T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d1af56d75", "title": "Writing better Action Mailers: Revisiting a core Rails concept", "url": "https://boringrails.com/articles/writing-better-action-mailers/", "published_at": "2023-01-16T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d1aff2488", "title": "Sorting ActiveRecord results by enum values (in SQL)", "url": "https://boringrails.com/tips/rails-active-record-sort-by-enum", "published_at": "2022-10-10T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d1ba44773", "title": "Thinking in Hotwire: Progressive Enhancement", "url": "https://boringrails.com/articles/thinking-in-hotwire-progressive-enhancement/", "published_at": "2022-08-16T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d1c993092", "title": "Galaxy brain CSS tricks with Hotwire and Rails", "url": "https://boringrails.com/articles/css-tips-and-tricks-hotwire/", "published_at": "2022-07-26T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d1cc67614", "title": "Adding keyboard shortcuts and hotkeys to StimulusJS", "url": "https://boringrails.com/articles/stimulus-hotkeys-keyboard-shortcuts/", "published_at": "2022-07-11T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d1cf94810", "title": "The most underrated Rails helper: dom_id", "url": "https://boringrails.com/articles/rails-dom-id-the-most-underrated-helper/", "published_at": "2022-06-28T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d1d9e5789", "title": "Self-destructing StimulusJS controllers", "url": "https://boringrails.com/articles/self-destructing-stimulus-controllers/", "published_at": "2022-06-13T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d1e676571", "title": "Tailwind style CSS transitions with StimulusJS", "url": "https://boringrails.com/articles/tailwind-style-css-transitions-with-stimulusjs/", "published_at": "2022-06-01T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d1f5ec4d3", "title": "Dynamic user content in Rails with Liquid tags", "url": "https://boringrails.com/tips/rails-liquid-dynamic-user-content", "published_at": "2022-01-23T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d204f501e", "title": "Accessing Rails environment variables from a StimulusJS Controller", "url": "https://boringrails.com/tips/rails-environment-variables-stimulus-js", "published_at": "2022-01-20T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d212c06d4", "title": "Rails validations: database level check constraints", "url": "https://boringrails.com/tips/rails-check-constraints-database-validations", "published_at": "2022-01-18T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d21fcaed4", "title": "Debugging slow Heroku builds", "url": "https://boringrails.com/tips/debugging-slow-heroku-builds", "published_at": "2021-05-17T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d22baf026", "title": "Quickly explore your data with `uniq` and `tally`", "url": "https://boringrails.com/tips/explore-data-ruby-uniq-tally-count", "published_at": "2021-05-05T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d22ede6e3", "title": "Improving your Rails mailers with `email_address_with_name`", "url": "https://boringrails.com/tips/rails-mailers-email-address-with-name", "published_at": "2021-05-03T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d23cdb4c7", "title": "Building lightweight components with Rails Helpers and Stimulus", "url": "https://boringrails.com/tips/lightweight-components-with-helpers-stimulus", "published_at": "2021-04-12T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d24110f69", "title": "Combine `redirect_to` and the `anchor` option", "url": "https://boringrails.com/tips/redirect-to-anchor", "published_at": "2021-04-01T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2454945d", "title": "Lazy-loading content with Turbo Frames and skeleton loader", "url": "https://boringrails.com/tips/turboframe-lazy-load-skeleton", "published_at": "2021-03-30T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d24c3c5da", "title": "Building a Rails CI pipeline with GitHub Actions", "url": "https://boringrails.com/articles/building-a-rails-ci-pipeline-with-github-actions/", "published_at": "2021-03-28T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d25b1603b", "title": "Use `to_sql` to see what query ActiveRecord will generate", "url": "https://boringrails.com/tips/active-record-to-sql", "published_at": "2021-03-22T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d26967cd4", "title": "Prefer returning chainable ActiveRecord objects", "url": "https://boringrails.com/tips/chainable-activerecord-queries", "published_at": "2021-03-18T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d26dd9703", "title": "Rails validations: unique within a certain scope", "url": "https://boringrails.com/tips/rails-unique-scope", "published_at": "2021-03-16T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d27015c0a", "title": "Boring breadcrumbs for Rails", "url": "https://boringrails.com/tips/boring-breadcrumbs-rails", "published_at": "2021-03-12T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d27411e4e", "title": "Sharing common code between Rails controllers with `Scoped` pattern", "url": "https://boringrails.com/tips/rails-scoped-controllers-sharing-code", "published_at": "2021-03-10T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d27cc27f0", "title": "Run different ActiveRecord validations based on context", "url": "https://boringrails.com/tips/activerecord-validation-context", "published_at": "2021-03-08T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d28588b2c", "title": "Find records missing an association with `where.missing`", "url": "https://boringrails.com/tips/activerecord-where-missing-associations", "published_at": "2021-03-04T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d28d6ecc4", "title": "Testing multiple sessions in the same test with Capybara", "url": "https://boringrails.com/tips/capybara-multiple-user-sessions", "published_at": "2021-03-02T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2989a7d3", "title": "Pluck single values out of ActiveRecord models or Enumerables", "url": "https://boringrails.com/tips/rails-pluck-single-values", "published_at": "2021-02-26T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2a2d8020", "title": "Never mix up greater/less than when comparing dates again", "url": "https://boringrails.com/tips/rails-date-before-after", "published_at": "2021-02-24T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2a3962c3", "title": "Super readable String operations with `delete_prefix` and `delete_suffix`", "url": "https://boringrails.com/tips/ruby-delete-prefix-suffix", "published_at": "2021-02-22T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2aa5fd3b", "title": "Setting CSS classes in Markdown with Jekyll / Bridgetown", "url": "https://boringrails.com/tips/jekyll-css-class", "published_at": "2021-02-19T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2aad7973", "title": "Use Heroku Dataclips to share query and do ad-hoc data exports", "url": "https://boringrails.com/tips/heroku-data-clips", "published_at": "2021-02-18T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2ac5c6eb", "title": "Ensure required environment variables are set when booting up Rails", "url": "https://boringrails.com/tips/ensure-rails-env-vars", "published_at": "2021-02-17T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2b22fdb7", "title": "Search and debug gems with `bundle open`", "url": "https://boringrails.com/tips/bundle-open-debug-gems", "published_at": "2021-02-16T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2bdfb692", "title": "Automatically cast params with the Rails Attributes API", "url": "https://boringrails.com/tips/rails-attributes-api", "published_at": "2021-02-15T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2c609948", "title": "Show relevant chunks of text with Rails `excerpt` helper", "url": "https://boringrails.com/tips/rails-excerpt-helper", "published_at": "2021-02-12T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2cea9ef6", "title": "Use Rails `link_to_unless_current` for navigation links", "url": "https://boringrails.com/tips/rails-link-to-unless-current", "published_at": "2021-02-11T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2d227612", "title": "Use Rails `cycle` to avoid `i % 2 == 0` in your view loops", "url": "https://boringrails.com/tips/rails-cycle-for-view-loops", "published_at": "2021-02-09T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2defd138", "title": "Use the Rails helper `highlight` when showing search results", "url": "https://boringrails.com/tips/rails-highlight-search-results", "published_at": "2021-02-08T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2e77121a", "title": "Magic Responsive Tables with Stimulus and IntersectionObserver", "url": "https://boringrails.com/articles/responsive-tables-stimulus-intersection-observer/", "published_at": "2021-01-13T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2f1580e9", "title": "Hacktoberfest Recap: Open source Ruby/Rails work in 2020", "url": "https://boringrails.com/articles/hacktoberfest-2020-recap/", "published_at": "2020-11-16T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d2f45acec", "title": "Building GitHub-style Hovercards with StimulusJS and HTML-over-the-wire", "url": "https://boringrails.com/articles/hovercards-stimulus/", "published_at": "2020-06-22T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d302f90f6", "title": "Writing better StimulusJS controllers", "url": "https://boringrails.com/articles/better-stimulus-controllers/", "published_at": "2020-06-01T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d30f3405c", "title": "Feature Flags: The stupid simple way to de-stress production releases", "url": "https://boringrails.com/articles/feature-flags-simplest-thing-that-could-work/", "published_at": "2020-04-12T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d3120e638", "title": "Spring Cleaning: Tidying up your codebase", "url": "https://boringrails.com/articles/spring-cleaning/", "published_at": "2020-03-16T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d3218116c", "title": "Wrangling slow reports, large file exports, and long-running tasks in Rails with Active Job", "url": "https://boringrails.com/articles/large-exports-and-slow-reports-with-activejob/", "published_at": "2020-01-26T13:00:00+00:00" }, { "id": "01a08757-acdb-73ac-b906-f94d324a5d55", "title": "Managing Rails schema and data migrations without losing your mind", "url": "https://boringrails.com/articles/rails-database-migrations-strategy-how-to-manage-migrations-without-losing-your-mind/", "published_at": "2019-11-05T13:00:00+00:00" } ] posts Claim your blog
Back to boringrails.com
Blog · corpus.blog/blogs/boringrails.com/posts

boringrails.com

boringrails.com

2025

2024

2023

2022

2021

2020

2019