{"id":1292,"date":"2026-09-04T10:57:06","date_gmt":"2026-09-04T09:57:06","guid":{"rendered":"https:\/\/ruby-doc.org\/learn\/?page_id=1292"},"modified":"2026-09-10T15:28:28","modified_gmt":"2026-09-10T14:28:28","slug":"practical-ruby-tutorials-and-developer-guides","status":"publish","type":"page","link":"https:\/\/ruby-doc.org\/learn\/","title":{"rendered":"Practical Ruby Tutorials and Developer Guides"},"content":{"rendered":"\n<div class=\"wp-block-group has-background is-layout-constrained wp-container-core-group-is-layout-8372958d wp-block-group-is-layout-constrained\" style=\"border-radius:14px;background-color:#f3f7fa;margin-bottom:48px;padding-top:40px;padding-right:42px;padding-bottom:40px;padding-left:42px\">\n<p class=\"has-large-font-size wp-block-paragraph\">Ruby-Doc Learn is the practical companion to Ruby-Doc.org&#8217;s reference documentation. The documentation tells you what Ruby provides. Here, experienced Ruby contributors show how those pieces fit together in working code, where the trade-offs appear, and what to check when a program behaves differently from the example.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every tutorial is written for a defined audience and purpose. Where an article contains code, we aim to show the Ruby or framework version, the expected result and the limitations that matter in real projects.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-vivid-red-background-color has-background wp-element-button\" href=\"https:\/\/ruby-doc.org\/learn\/tutorials\/\">Browse all tutorials<\/a><\/div>\n\n\n\n<div class=\"wp-block-button is-style-outline is-style-outline--1\"><a class=\"wp-block-button__link wp-element-button\" href=\"#latest-tutorials\">Latest tutorials<\/a><\/div>\n\n\n\n<div class=\"wp-block-button is-style-outline is-style-outline--2\"><a class=\"wp-block-button__link wp-element-button\" href=\"#how-we-work\">How tutorials are reviewed<\/a><\/div>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Choose a practical starting point<\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-995f960e wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group has-border-color is-layout-constrained wp-container-core-group-is-layout-37f7573b wp-block-group-is-layout-constrained\" style=\"border-color:#d8e1e8;border-width:1px;border-radius:12px;margin-bottom:24px;padding-top:26px;padding-right:26px;padding-bottom:26px;padding-left:26px\">\n<h3 class=\"wp-block-heading\">Learn Ruby through examples<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Start with short, runnable examples covering strings, collections, methods, classes, files, JSON and regular expressions. Each example is designed to answer a particular question rather than demonstrate syntax in isolation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/ruby-doc.org\/learn\/ruby-code-examples\/\"><strong>Read Ruby Code Examples \u2192<\/strong><\/a><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-border-color is-layout-constrained wp-container-core-group-is-layout-640a04ee wp-block-group-is-layout-constrained\" style=\"border-color:#d8e1e8;border-width:1px;border-radius:12px;padding-top:26px;padding-right:26px;padding-bottom:26px;padding-left:26px\">\n<h3 class=\"wp-block-heading\">Compare Ruby with Python<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">See how Ruby and Python differ in syntax, web development, automation, data work and day-to-day developer experience. The comparison is intended to help you choose an appropriate tool, not declare a universal winner.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/ruby-doc.org\/learn\/ruby-vs-python\/\"><strong>Read Ruby vs Python \u2192<\/strong><\/a><\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group has-border-color is-layout-constrained wp-container-core-group-is-layout-37f7573b wp-block-group-is-layout-constrained\" style=\"border-color:#d8e1e8;border-width:1px;border-radius:12px;margin-bottom:24px;padding-top:26px;padding-right:26px;padding-bottom:26px;padding-left:26px\">\n<h3 class=\"wp-block-heading\">Run Rails with fewer blind spots<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A Rails process can be online while background work has quietly stopped. This guide looks at health checks, job heartbeats and status reporting from the point of view of someone responsible for a working application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/ruby-doc.org\/learn\/the-rails-app-was-running-but-it-wasnt-working\/\"><strong>Read the Rails operations guide \u2192<\/strong><\/a><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-border-color is-layout-constrained wp-container-core-group-is-layout-640a04ee wp-block-group-is-layout-constrained\" style=\"border-color:#d8e1e8;border-width:1px;border-radius:12px;padding-top:26px;padding-right:26px;padding-bottom:26px;padding-left:26px\">\n<h3 class=\"wp-block-heading\">Build dependable automation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Move beyond a one-off script by making rules visible, handling retries safely, recording what happened and keeping human approval where it belongs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/ruby-doc.org\/learn\/business-process-automation-with-ruby\/\"><strong>Read the Ruby automation guide \u2192<\/strong><\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" style=\"margin-top:52px;margin-bottom:52px\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"browse-topics\">Browse by topic<\/h2>\n\n\n<ul class=\"wp-block-categories-list wp-block-categories-taxonomy-category wp-block-categories\">\t<li class=\"cat-item cat-item-4\"><a href=\"https:\/\/ruby-doc.org\/learn\/category\/programming\/\">Programming<\/a> (20)\n<\/li>\n\t<li class=\"cat-item cat-item-19\"><a href=\"https:\/\/ruby-doc.org\/learn\/category\/ruby-projects\/\">Ruby Projects<\/a> (10)\n<\/li>\n\t<li class=\"cat-item cat-item-3\"><a href=\"https:\/\/ruby-doc.org\/learn\/category\/ruby-tips\/\">Ruby tips<\/a> (25)\n<\/li>\n<\/ul>\n\n\n<h2 class=\"wp-block-heading\" id=\"latest-tutorials\">Latest tutorials<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The newest published Ruby-Doc Learn articles appear here. Each article identifies its author, publication date and, where applicable, its technical reviewer and most recent review date.<\/p>\n\n\n<ul class=\"wp-block-latest-posts__list is-grid columns-3 has-dates has-author wp-block-latest-posts is-layout-flow wp-block-latest-posts-is-layout-flow\"><li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ruby-doc.org\/learn\/legacy-rails-modernization-ui-design-agencies\/\">UI Design Agencies for Modernizing Legacy Ruby on Rails Apps<\/a><div class=\"wp-block-latest-posts__post-author\">by James Britt<\/div><time datetime=\"2026-10-09T09:04:09+01:00\" class=\"wp-block-latest-posts__post-date\">October 9, 2026<\/time><div class=\"wp-block-latest-posts__post-excerpt\">Eight UI design agencies to consider for an established Ruby on Rails application, with practical questions about Ruby experience, workflow preservation, testing, and implementation.<\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ruby-doc.org\/learn\/using-rust-with-ruby-integration-options-and-how-to-choose-a-development-partner\/\">Using Rust with Ruby: Integration Options and How to Choose a Development Partner<\/a><div class=\"wp-block-latest-posts__post-author\">by James Britt<\/div><time datetime=\"2026-10-07T09:10:15+01:00\" class=\"wp-block-latest-posts__post-date\">October 7, 2026<\/time><div class=\"wp-block-latest-posts__post-excerpt\">A Ruby application can work well for years before one job starts taking too long. A nightly import may spend hours parsing files. A\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/ruby-doc.org\/learn\/using-rust-with-ruby-integration-options-and-how-to-choose-a-development-partner\/\" rel=\"noopener\">Read more<span class=\"screen-reader-text\">: Using Rust with Ruby: Integration Options and How to Choose a Development Partner<\/span><\/a><\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ruby-doc.org\/learn\/download-instagram-highlights-ruby\/\">Download Instagram Highlights: A Sixteen-Year Changelog for Ruby Developers<\/a><div class=\"wp-block-latest-posts__post-author\">by James Britt<\/div><time datetime=\"2026-10-06T15:43:36+01:00\" class=\"wp-block-latest-posts__post-date\">October 6, 2026<\/time><div class=\"wp-block-latest-posts__post-excerpt\">A Ruby developer\u2019s guide to Instagram Highlights: the history of old gems, current API limits, manual download options and authorised Story archiving.<\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ruby-doc.org\/learn\/building-a-reliable-ruby-development-environment\/\">Building a Reliable Ruby Development Environment<\/a><div class=\"wp-block-latest-posts__post-author\">by James Britt<\/div><time datetime=\"2026-10-02T10:46:30+01:00\" class=\"wp-block-latest-posts__post-date\">October 2, 2026<\/time><div class=\"wp-block-latest-posts__post-excerpt\">A Rails test works for your colleague but fails on your laptop. Before changing the application, check Ruby versions, installed gems and database configurations.\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/ruby-doc.org\/learn\/building-a-reliable-ruby-development-environment\/\" rel=\"noopener\">Read more<span class=\"screen-reader-text\">: Building a Reliable Ruby Development Environment<\/span><\/a><\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ruby-doc.org\/learn\/build-a-digital-wardrobe-in-ruby\/\">Build a Digital Wardrobe in Ruby<\/a><div class=\"wp-block-latest-posts__post-author\">by James Britt<\/div><time datetime=\"2026-10-01T13:15:00+01:00\" class=\"wp-block-latest-posts__post-date\">October 1, 2026<\/time><div class=\"wp-block-latest-posts__post-excerpt\">A wardrobe tracker makes a useful Ruby project because its rules are easy to inspect. An item belongs to someone, has a category and\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/ruby-doc.org\/learn\/build-a-digital-wardrobe-in-ruby\/\" rel=\"noopener\">Read more<span class=\"screen-reader-text\">: Build a Digital Wardrobe in Ruby<\/span><\/a><\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ruby-doc.org\/learn\/ruby-on-rails-cloud-migration\/\">Ruby on Rails Cloud Migration in 2026: What CIOs Should Check Before Moving<\/a><div class=\"wp-block-latest-posts__post-author\">by James Britt<\/div><time datetime=\"2026-09-30T07:32:00+01:00\" class=\"wp-block-latest-posts__post-date\">September 30, 2026<\/time><div class=\"wp-block-latest-posts__post-excerpt\">The Rails application boots on its new cloud host. The home page loads, staff can sign in, and the migration looks finished. Then someone\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/ruby-doc.org\/learn\/ruby-on-rails-cloud-migration\/\" rel=\"noopener\">Read more<span class=\"screen-reader-text\">: Ruby on Rails Cloud Migration in 2026: What CIOs Should Check Before Moving<\/span><\/a><\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ruby-doc.org\/learn\/ai-and-ruby-an-unexpectedly-natural-pairing\/\">AI and Ruby: An Unexpectedly Natural Pairing<\/a><div class=\"wp-block-latest-posts__post-author\">by James Britt<\/div><time datetime=\"2026-09-29T11:03:00+01:00\" class=\"wp-block-latest-posts__post-date\">September 29, 2026<\/time><div class=\"wp-block-latest-posts__post-excerpt\">Let\u2019s say you\u2019ve got an inbox for support inside your Rails app. A customer has sent 6 messages. Two people have responded. Now someone\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/ruby-doc.org\/learn\/ai-and-ruby-an-unexpectedly-natural-pairing\/\" rel=\"noopener\">Read more<span class=\"screen-reader-text\">: AI and Ruby: An Unexpectedly Natural Pairing<\/span><\/a><\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ruby-doc.org\/learn\/proxy-rotation-in-ruby-the-patterns-that-actually-work\/\">Proxy Rotation in Ruby: The Patterns That Actually Work<\/a><div class=\"wp-block-latest-posts__post-author\">by James Britt<\/div><time datetime=\"2026-09-29T09:35:00+01:00\" class=\"wp-block-latest-posts__post-date\">September 29, 2026<\/time><div class=\"wp-block-latest-posts__post-excerpt\">A Ruby web crawler may start out with three proxy servers and a call to Array#sample. That can work at first. Later, a proxy\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/ruby-doc.org\/learn\/proxy-rotation-in-ruby-the-patterns-that-actually-work\/\" rel=\"noopener\">Read more<span class=\"screen-reader-text\">: Proxy Rotation in Ruby: The Patterns That Actually Work<\/span><\/a><\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ruby-doc.org\/learn\/public-status-pages-for-ruby-on-rails-applications\/\">Public Status Pages for Ruby on Rails Applications: Looking Beyond a Green Dashboard<\/a><div class=\"wp-block-latest-posts__post-author\">by James Britt<\/div><time datetime=\"2026-09-28T12:33:00+01:00\" class=\"wp-block-latest-posts__post-date\">September 28, 2026<\/time><div class=\"wp-block-latest-posts__post-excerpt\">Picture a familiar Rails support problem: a customer has requested a CSV export, the application has accepted it, and the download never arrives. You\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/ruby-doc.org\/learn\/public-status-pages-for-ruby-on-rails-applications\/\" rel=\"noopener\">Read more<span class=\"screen-reader-text\">: Public Status Pages for Ruby on Rails Applications: Looking Beyond a Green Dashboard<\/span><\/a><\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ruby-doc.org\/learn\/building-a-ruby-on-rails-referral-tracker-healthcare-software-partners-vs-contractors\/\">Building a Ruby on Rails Referral Tracker: Healthcare Software Partners vs Contractors<\/a><div class=\"wp-block-latest-posts__post-author\">by James Britt<\/div><time datetime=\"2026-09-27T14:01:03+01:00\" class=\"wp-block-latest-posts__post-date\">September 27, 2026<\/time><div class=\"wp-block-latest-posts__post-excerpt\">A referral has been sent, but nobody knows whether the specialist got it. Reception checks the electronic health record (EHR). A nurse searches her\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/ruby-doc.org\/learn\/building-a-ruby-on-rails-referral-tracker-healthcare-software-partners-vs-contractors\/\" rel=\"noopener\">Read more<span class=\"screen-reader-text\">: Building a Ruby on Rails Referral Tracker: Healthcare Software Partners vs Contractors<\/span><\/a><\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/\">How to Compress Ruby Demo Videos<\/a><div class=\"wp-block-latest-posts__post-author\">by James Britt<\/div><time datetime=\"2026-09-26T10:07:00+01:00\" class=\"wp-block-latest-posts__post-date\">September 26, 2026<\/time><div class=\"wp-block-latest-posts__post-excerpt\">In many cases, all we want to view in a Ruby demo is one simple thing, like finding out which button caused a Rails\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/\" rel=\"noopener\">Read more<span class=\"screen-reader-text\">: How to Compress Ruby Demo Videos<\/span><\/a><\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ruby-doc.org\/learn\/build-a-flight-enquiry-tracker-in-ruby\/\">Build a Flight Enquiry Tracker in Ruby on Rails<\/a><div class=\"wp-block-latest-posts__post-author\">by James Britt<\/div><time datetime=\"2026-09-25T09:36:00+01:00\" class=\"wp-block-latest-posts__post-date\">September 25, 2026<\/time><div class=\"wp-block-latest-posts__post-excerpt\">A customer asks about a charter flight for Friday. Later, they change the departure airport, add another passenger and ask whether the original quote\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/ruby-doc.org\/learn\/build-a-flight-enquiry-tracker-in-ruby\/\" rel=\"noopener\">Read more<span class=\"screen-reader-text\">: Build a Flight Enquiry Tracker in Ruby on Rails<\/span><\/a><\/div><\/li>\n<\/ul>\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/ruby-doc.org\/learn\/tutorials\/\"><strong>Browse all tutorials \u2192<\/strong><\/a> \u2014 use the numbered pages to find older articles.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" style=\"margin-top:52px;margin-bottom:52px\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"how-we-work\">How our tutorials are created<\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-995f960e wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h3 class=\"wp-block-heading\">A real problem comes first<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A tutorial should help a recognisable group of Ruby users solve a defined problem. We do not select subjects solely because they are attracting search traffic. The topic must fit Ruby-Doc Learn and offer something useful to Ruby developers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Examples are checked<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Authors are expected to test code wherever practical, identify relevant software versions and show the expected output. Technical claims should point to primary sources such as official Ruby, framework or project documentation.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h3 class=\"wp-block-heading\">Review is specific and accountable<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A technical-review credit is displayed only after the named reviewer has examined that article. Review may cover code behaviour, terminology, version compatibility, security considerations and whether the conclusions are supported.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Updates should mean something<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Publication and update dates help readers judge whether an article fits their environment. When a substantive correction changes the technical meaning of a guide, the change should be explained rather than hidden behind a fresh date.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-text-color has-background is-layout-constrained wp-container-core-group-is-layout-999285d1 wp-block-group-is-layout-constrained\" style=\"border-radius:14px;color:#ffffff;background-color:#101820;margin-top:52px;margin-bottom:52px;padding-top:38px;padding-right:38px;padding-bottom:38px;padding-left:38px\">\n<h2 class=\"wp-block-heading has-white-color has-text-color\">The people behind Ruby-Doc Learn<\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-995f960e wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h3 class=\"wp-block-heading has-white-color has-text-color\">James Britt \u2014 Author and editor<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">James Britt created Ruby-Doc.org in 2002 and served as its long-term maintainer. He writes practical Ruby tutorials that connect documentation with the decisions developers make while building and maintaining software.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/ruby-doc.org\/learn\/james-britt\/\" style=\"color:#ff9b9b\"><strong>View James Britt&#8217;s verified profile \u2192<\/strong><\/a><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h3 class=\"wp-block-heading has-white-color has-text-color\">Jim Freeze \u2014 Technical reviewer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Jim Freeze is a Ruby developer, technical educator and early contributor to the documentation effort that helped lead to Ruby-Doc.org. His review credit appears only on tutorials he has personally reviewed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/ruby-doc.org\/learn\/jim-freeze\/\" style=\"color:#ff9b9b\"><strong>View Jim Freeze&#8217;s verified reviewer profile \u2192<\/strong><\/a><\/p>\n<\/div>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-white-color has-alpha-channel-opacity has-white-background-color has-background is-style-wide\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-white-color has-text-color\">Ruby-Doc&#8217;s contributor history<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ruby-Doc Learn also documents the work of contributors such as Gavin Sinclair, whose writing and tooling supported the early Ruby documentation ecosystem. Historical contribution is described separately from a present editorial role. <a href=\"https:\/\/ruby-doc.org\/learn\/gavin-sinclair\/\" style=\"color:#ff9b9b\"><strong>View Gavin Sinclair&#8217;s contribution profile \u2192<\/strong><\/a><\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Editorial standards and corrections<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ruby-Doc Learn publishes its editorial policy, author and reviewer standards, corrections process, advertising and sponsorship rules, and a direct route for reporting errors. These policies apply to the tutorials in this section.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-outline is-style-outline--3\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/ruby-doc.org\/learn\/editorial-policy\/\">Editorial policy<\/a><\/div>\n\n\n\n<div class=\"wp-block-button is-style-outline is-style-outline--4\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/ruby-doc.org\/learn\/author-reviewer-standards\/\">Author and reviewer standards<\/a><\/div>\n\n\n\n<div class=\"wp-block-button is-style-outline is-style-outline--5\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/ruby-doc.org\/learn\/report-an-error\/\">Report an error<\/a><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-background is-layout-constrained wp-container-core-group-is-layout-696ba3d2 wp-block-group-is-layout-constrained\" style=\"border-radius:14px;background-color:#f3f7fa;margin-top:52px;padding-top:34px;padding-right:36px;padding-bottom:34px;padding-left:36px\">\n<h2 class=\"wp-block-heading\">Reference documentation is still at the heart of Ruby-Doc.org<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use Ruby-Doc Learn when you want a worked explanation or a practical route through a problem. Use the main Ruby-Doc.org documentation when you need the exact API, class, module or standard-library reference for your Ruby version.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-vivid-red-background-color has-background wp-element-button\" href=\"https:\/\/ruby-doc.org\/current\">Browse current Ruby documentation<\/a><\/div>\n\n\n\n<div class=\"wp-block-button is-style-outline is-style-outline--6\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/ruby-doc.org\/downloads\">Download Ruby documentation<\/a><\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ruby-Doc Learn is the practical companion to Ruby-Doc.org&#8217;s reference documentation. The documentation tells you what Ruby provides. Here, experienced Ruby contributors show how those pieces fit together in working code, where the trade-offs appear, and what to check when a program behaves differently from the example. Every tutorial is written for a defined audience and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1292","page","type-page","status-publish","hentry"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Ruby Tutorials and Developer Guides | Ruby-Doc Learn<\/title>\n<meta name=\"description\" content=\"Learn Ruby with practical tutorials, tested code examples and technically reviewed developer guides from the contributors behind Ruby-Doc.org.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ruby-doc.org\/learn\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ruby Tutorials and Developer Guides | Ruby-Doc Learn\" \/>\n<meta property=\"og:description\" content=\"Learn Ruby with practical tutorials, tested code examples and technically reviewed developer guides from the contributors behind Ruby-Doc.org.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ruby-doc.org\/learn\/\" \/>\n<meta property=\"og:site_name\" content=\"Ruby-Doc Learn\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-10T14:28:28+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/\",\"name\":\"Ruby Tutorials and Developer Guides | Ruby-Doc Learn\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#website\"},\"datePublished\":\"2026-09-04T09:57:06+00:00\",\"dateModified\":\"2026-09-10T14:28:28+00:00\",\"description\":\"Learn Ruby with practical tutorials, tested code examples and technically reviewed developer guides from the contributors behind Ruby-Doc.org.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Practical Ruby Tutorials and Developer Guides\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#website\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/\",\"name\":\"Ruby-Doc Learn\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#organization\",\"name\":\"Ruby-Doc Learn\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ruby-doc-logo-transparent.png\",\"contentUrl\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ruby-doc-logo-transparent.png\",\"width\":1650,\"height\":305,\"caption\":\"Ruby-Doc Learn\"},\"image\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ruby Tutorials and Developer Guides | Ruby-Doc Learn","description":"Learn Ruby with practical tutorials, tested code examples and technically reviewed developer guides from the contributors behind Ruby-Doc.org.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ruby-doc.org\/learn\/","og_locale":"en_US","og_type":"article","og_title":"Ruby Tutorials and Developer Guides | Ruby-Doc Learn","og_description":"Learn Ruby with practical tutorials, tested code examples and technically reviewed developer guides from the contributors behind Ruby-Doc.org.","og_url":"https:\/\/ruby-doc.org\/learn\/","og_site_name":"Ruby-Doc Learn","article_modified_time":"2026-09-10T14:28:28+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/ruby-doc.org\/learn\/","url":"https:\/\/ruby-doc.org\/learn\/","name":"Ruby Tutorials and Developer Guides | Ruby-Doc Learn","isPartOf":{"@id":"https:\/\/ruby-doc.org\/learn\/#website"},"datePublished":"2026-09-04T09:57:06+00:00","dateModified":"2026-09-10T14:28:28+00:00","description":"Learn Ruby with practical tutorials, tested code examples and technically reviewed developer guides from the contributors behind Ruby-Doc.org.","breadcrumb":{"@id":"https:\/\/ruby-doc.org\/learn\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ruby-doc.org\/learn\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ruby-doc.org\/learn\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ruby-doc.org\/learn\/"},{"@type":"ListItem","position":2,"name":"Practical Ruby Tutorials and Developer Guides"}]},{"@type":"WebSite","@id":"https:\/\/ruby-doc.org\/learn\/#website","url":"https:\/\/ruby-doc.org\/learn\/","name":"Ruby-Doc Learn","description":"","publisher":{"@id":"https:\/\/ruby-doc.org\/learn\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ruby-doc.org\/learn\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ruby-doc.org\/learn\/#organization","name":"Ruby-Doc Learn","url":"https:\/\/ruby-doc.org\/learn\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ruby-doc.org\/learn\/#\/schema\/logo\/image\/","url":"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/ruby-doc-logo-transparent.png","contentUrl":"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/ruby-doc-logo-transparent.png","width":1650,"height":305,"caption":"Ruby-Doc Learn"},"image":{"@id":"https:\/\/ruby-doc.org\/learn\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/pages\/1292","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/comments?post=1292"}],"version-history":[{"count":3,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/pages\/1292\/revisions"}],"predecessor-version":[{"id":1536,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/pages\/1292\/revisions\/1536"}],"wp:attachment":[{"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/media?parent=1292"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}