{"id":3040,"date":"2022-04-05T10:49:14","date_gmt":"2022-04-05T10:49:14","guid":{"rendered":"http:\/\/the-codest.localhost\/blog\/applying-the-use-case-pattern-with-rails\/"},"modified":"2026-04-28T14:05:29","modified_gmt":"2026-04-28T14:05:29","slug":"stosowanie-wzorca-przypadku-uzycia-z-szynami","status":"publish","type":"post","link":"https:\/\/thecodest.co\/pl\/blog\/applying-the-use-case-pattern-with-rails\/","title":{"rendered":"Stosowanie wzorca przypadk\u00f3w u\u017cycia w Railsach"},"content":{"rendered":"\n<p>The logic is often placed in the Controllers, Models, or if we are lucky in a Service Object. So if we have Service Objects then why do we need Use Cases?<\/p>\n\n\n\n<p>Follow me in this article to discover the benefits of this pattern.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Use Case<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Definition<\/h3>\n\n\n\n<p><em>A use case is a list of actions or event steps typically defining the interactions between a role and a system to achieve a goal.<\/em><\/p>\n\n\n\n<p>It\u2019s worth mentioning that this pattern is applied in many different ways and has alternative names. We can find it as <b>Interactors<\/b>, <b>Operators<\/b> or <b>Commands<\/b>, but in the <strong><a href=\"https:\/\/thecodest.co\/pl\/blog\/hire-ror-developer\/\">Ruby<\/a><\/strong> community we stick with <strong>Use Case<\/strong>. Every implementation is different but with the same purpose: to serve a user&#8217;s use case of the system.<\/p>\n\n\n\n<p>Even if in our <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/why-do-projects-fail\/\">project<\/a> we are not defining the requirements using <strong>Use Case<\/strong>s and UML this pattern is still useful to structure the business logic in a practical way.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rules<\/h3>\n\n\n\n<p>Our <strong>Use Cases<\/strong> must be:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Framework agnostic<\/li>\n\n\n\n<li>Database agnostic<\/li>\n\n\n\n<li>Responsible for only one thing (define the steps to achieve the user\u2019s goal)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Benefits<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Readability: Easy to read and understand since the steps are clearly defined.<\/li>\n\n\n\n<li>Decoupling: Move the logic from Controllers and Models and create a new level of abstraction.<\/li>\n\n\n\n<li>Visibility: The codebase reveals the features available in the system.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Into Practice<\/h2>\n\n\n\n<p>Let\u2019s take the example of a user that wants to purchase something in our system.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">module UseCases\n  module Buyer\n    class Purchase\n      def initialize(buyer:, cart:)\n        @buyer = buyer\n        @cart = cart\n      end\n      def call\n        return unless check_stock\n        return unless create_purchase\nnotify end\nprivate\n      attr_reader :buyer, :cart\n      def check_stock\n        Services::CheckStock.call(cart: cart)\nend\n      def create_purchase\n        Services::CreatePurchase.call(buyer: buyer, cart: cart).call\n      end\n      def notify\n\n         Services::NotifyBuyer.call(buyer: buyer)\n       end\n     end\n   end\n end<\/code><\/pre>\n\n\n\n<p>As you may see in this <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/what-is-code-refactoring\/\">code<\/a> example, we created a new <strong>Use Case<\/strong> called Purchase. We defined only one public method <b>call<\/b>. Inside the call method, we find pretty basic steps to make a purchase, and all the steps are defined as private methods. Every step is calling a Service Object, this way our <strong>Use Case<\/strong> is only defining the steps to make a purchase and not the logic itself. This gives <a href=\"https:\/\/thecodest.co\/pl\/blog\/why-us-companies-are-opting-for-polish-developers\/\">us<\/a> a clear picture of what can be done in our system (make a purchase) and the steps to achieve that.<\/p>\n\n\n\n<p>Now we are ready to call our first <strong>Use Case<\/strong> from a controller.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">class Controller\n  def purchase\n    UseCases::Buyer::Purchase.new(\n      buyer: purchase_params[:buyer],\n      cart: purchase_params[:cart]\n    ).call\n\n    ...\n  end\n\n  ...\nend<\/code><\/pre>\n\n\n\n<p>From this perspective, the <strong>Use Case<\/strong> looks pretty much like a Service Object but the purpose is different. A Service Object accomplishes a low-level task and interacts with different parts of the system like the Database while the <strong>Use Case creates<\/strong> a new high-level abstraction and defines the logical steps.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Improvements<\/h2>\n\n\n\n<p>Our first <strong>Use Case<\/strong> works but could be better. How could we improve it? Let\u2019s make use of the <b>dry<\/b> gems. In this case we are going to use <b>dry-transaction<\/b>.<\/p>\n\n\n\n<p>First let\u2019s define our base class.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">class UseCase\n  include Dry::Transaction\n\n  class &lt;&lt; self\n    def call(**args)\n      new.call(**args)\n    end\n  end\nend<\/code><\/pre>\n\n\n\n<p>This will help us to pass attributes to the UseCase transaction and use them. Then we are ready to re-define our Purchase Use Case.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">module UseCases\n  module Buyer\n    class Purchase\n      def initialize(buyer:, cart:)\n        @buyer = buyer\n        @cart = cart\n      end\n\n      def call\n        return unless check_stock\n        return unless create_purchase\n        notify\n      end\n\n      private\n\n      attr_reader :buyer, :cart\n\n      def check_stock\n        Services::CheckStock.call(cart: cart)\n      end\n\n      def create_purchase\n        Services::CreatePurchase.call(buyer: buyer, cart: cart).call\n      end\n\n      def notify\n        Services::NotifyBuyer.call(buyer: buyer)\n      end\n    end\n   end\n end<\/code><\/pre>\n\n\n\n<p>With the new changes, we can see in a clear way how our steps are defined and we can manage the result of every step with Success() and Failure().<\/p>\n\n\n\n<p>We are ready to call our new Use Case in the controller and prepare our response depending on the final result.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">class Controller\n  def purchase\n    UseCases::Buyer::Purchase.new.call(\n      buyer: purchase_params[:buyer],\n      cart: purchase_params[:cart]\n    ) do |result|\n      result.success do\n        ...\n      end\n      result.failure do\n        ...\n      end\n    end\n\n    ...\n  end\n\n  ...\nend<\/code><\/pre>\n\n\n\n<p>This example could be improved even more with validations but this is enough to show the power of this pattern.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusions<\/h2>\n\n\n\n<p>Let\u2019s be honest here, the <strong>Use Case pattern<\/strong> is pretty simple and looks a lot like a Service Object but this level of abstraction can make a big change in your application.<\/p>\n\n\n\n<p>Imagine a new <a href=\"https:\/\/thecodest.co\/pl\/blog\/hire-vue-js-developers\/\">developer<\/a> joining the project and opening the folder use_cases, as a first impression he will have a list of all the features available in the system and after opening one Use Case he will see all the necessary steps for that feature without going deep in the logic. This sense of order and control is the major benefit of this pattern.<\/p>\n\n\n\n<p>Take this in your toolbox and maybe in the future you will make good use of it.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/thecodest.co\/contact\/\"><img loading=\"lazy\" decoding=\"async\" width=\"1283\" height=\"460\" src=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_.png\" alt=\"\" class=\"wp-image-4927\" srcset=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_.png 1283w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-300x108.png 300w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-1024x367.png 1024w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-768x275.png 768w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-18x6.png 18w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-67x24.png 67w\" sizes=\"auto, (max-width: 1283px) 100vw, 1283px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Cz\u0119stym problemem podczas pracy z Railsami jest decyzja, gdzie umie\u015bci\u0107 logik\u0119 naszych funkcji.<\/p>","protected":false},"author":2,"featured_media":3041,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[8],"tags":[],"class_list":["post-3040","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-development"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Applying the Use Case Pattern with Rails - The Codest<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/thecodest.co\/pl\/blog\/stosowanie-wzorca-przypadku-uzycia-z-szynami\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Applying the Use Case Pattern with Rails\" \/>\n<meta property=\"og:description\" content=\"A common problem while working with Rails is to decide where to place the logic from our features.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/thecodest.co\/pl\/blog\/stosowanie-wzorca-przypadku-uzycia-z-szynami\/\" \/>\n<meta property=\"og:site_name\" content=\"The Codest\" \/>\n<meta property=\"article:published_time\" content=\"2022-04-05T10:49:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-28T14:05:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/applying_the_use_case_pattern_with_rails.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"thecodest\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"thecodest\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minuty\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/applying-the-use-case-pattern-with-rails\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/applying-the-use-case-pattern-with-rails\\\/\"},\"author\":{\"name\":\"thecodest\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\"},\"headline\":\"Applying the Use Case Pattern with Rails\",\"datePublished\":\"2022-04-05T10:49:14+00:00\",\"dateModified\":\"2026-04-28T14:05:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/applying-the-use-case-pattern-with-rails\\\/\"},\"wordCount\":649,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/applying-the-use-case-pattern-with-rails\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/applying_the_use_case_pattern_with_rails.png\",\"articleSection\":[\"Software Development\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/applying-the-use-case-pattern-with-rails\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/applying-the-use-case-pattern-with-rails\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/applying-the-use-case-pattern-with-rails\\\/\",\"name\":\"Applying the Use Case Pattern with Rails - The Codest\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/applying-the-use-case-pattern-with-rails\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/applying-the-use-case-pattern-with-rails\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/applying_the_use_case_pattern_with_rails.png\",\"datePublished\":\"2022-04-05T10:49:14+00:00\",\"dateModified\":\"2026-04-28T14:05:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/applying-the-use-case-pattern-with-rails\\\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/applying-the-use-case-pattern-with-rails\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/applying-the-use-case-pattern-with-rails\\\/#primaryimage\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/applying_the_use_case_pattern_with_rails.png\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/applying_the_use_case_pattern_with_rails.png\",\"width\":960,\"height\":540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/applying-the-use-case-pattern-with-rails\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/thecodest.co\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Applying the Use Case Pattern with Rails\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"name\":\"The Codest\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/thecodest.co\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"width\":144,\"height\":36,\"caption\":\"The Codest\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/pl.linkedin.com\\\/company\\\/codest\",\"https:\\\/\\\/clutch.co\\\/profile\\\/codest\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\",\"name\":\"thecodest\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"caption\":\"thecodest\"},\"url\":\"https:\\\/\\\/thecodest.co\\\/pl\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Zastosowanie wzorca przypadk\u00f3w u\u017cycia w Railsach - The Codest","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:\/\/thecodest.co\/pl\/blog\/stosowanie-wzorca-przypadku-uzycia-z-szynami\/","og_locale":"pl_PL","og_type":"article","og_title":"Applying the Use Case Pattern with Rails","og_description":"A common problem while working with Rails is to decide where to place the logic from our features.","og_url":"https:\/\/thecodest.co\/pl\/blog\/stosowanie-wzorca-przypadku-uzycia-z-szynami\/","og_site_name":"The Codest","article_published_time":"2022-04-05T10:49:14+00:00","article_modified_time":"2026-04-28T14:05:29+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/applying_the_use_case_pattern_with_rails.png","type":"image\/png"}],"author":"thecodest","twitter_card":"summary_large_image","twitter_misc":{"Written by":"thecodest","Est. reading time":"4 minuty"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/thecodest.co\/blog\/applying-the-use-case-pattern-with-rails\/#article","isPartOf":{"@id":"https:\/\/thecodest.co\/blog\/applying-the-use-case-pattern-with-rails\/"},"author":{"name":"thecodest","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76"},"headline":"Applying the Use Case Pattern with Rails","datePublished":"2022-04-05T10:49:14+00:00","dateModified":"2026-04-28T14:05:29+00:00","mainEntityOfPage":{"@id":"https:\/\/thecodest.co\/blog\/applying-the-use-case-pattern-with-rails\/"},"wordCount":649,"commentCount":0,"publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"image":{"@id":"https:\/\/thecodest.co\/blog\/applying-the-use-case-pattern-with-rails\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/applying_the_use_case_pattern_with_rails.png","articleSection":["Software Development"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/thecodest.co\/blog\/applying-the-use-case-pattern-with-rails\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/thecodest.co\/blog\/applying-the-use-case-pattern-with-rails\/","url":"https:\/\/thecodest.co\/blog\/applying-the-use-case-pattern-with-rails\/","name":"Zastosowanie wzorca przypadk\u00f3w u\u017cycia w Railsach - The Codest","isPartOf":{"@id":"https:\/\/thecodest.co\/#website"},"primaryImageOfPage":{"@id":"https:\/\/thecodest.co\/blog\/applying-the-use-case-pattern-with-rails\/#primaryimage"},"image":{"@id":"https:\/\/thecodest.co\/blog\/applying-the-use-case-pattern-with-rails\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/applying_the_use_case_pattern_with_rails.png","datePublished":"2022-04-05T10:49:14+00:00","dateModified":"2026-04-28T14:05:29+00:00","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/applying-the-use-case-pattern-with-rails\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/applying-the-use-case-pattern-with-rails\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/thecodest.co\/blog\/applying-the-use-case-pattern-with-rails\/#primaryimage","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/applying_the_use_case_pattern_with_rails.png","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/applying_the_use_case_pattern_with_rails.png","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/thecodest.co\/blog\/applying-the-use-case-pattern-with-rails\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/thecodest.co\/"},{"@type":"ListItem","position":2,"name":"Applying the Use Case Pattern with Rails"}]},{"@type":"WebSite","@id":"https:\/\/thecodest.co\/#website","url":"https:\/\/thecodest.co\/","name":"The Codest","description":"","publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/thecodest.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","width":144,"height":36,"caption":"The Codest"},"image":{"@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/pl.linkedin.com\/company\/codest","https:\/\/clutch.co\/profile\/codest"]},{"@type":"Person","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76","name":"thecodest","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","caption":"thecodest"},"url":"https:\/\/thecodest.co\/pl\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts\/3040","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/comments?post=3040"}],"version-history":[{"count":7,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts\/3040\/revisions"}],"predecessor-version":[{"id":8553,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts\/3040\/revisions\/8553"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/media\/3041"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/media?parent=3040"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/categories?post=3040"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/tags?post=3040"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}