{"id":8697,"date":"2022-11-10T21:28:53","date_gmt":"2022-11-10T12:28:53","guid":{"rendered":"https:\/\/yumishin.com\/?p=8697"},"modified":"2022-11-10T21:28:53","modified_gmt":"2022-11-10T12:28:53","slug":"rails-clean-architecture","status":"publish","type":"post","link":"https:\/\/yumishin.com\/?p=8697","title":{"rendered":"Rails\u3068Clean Architecture\u3067API"},"content":{"rendered":"<h3 id=\"i-0\">\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u9020<\/h3>\n<div class=\"pre_tag\"><span><i class=\"fa fa-code\"><\/i> \u30b3\u30fc\u30c9<\/span><\/p>\n<pre><code>app\/\n  controllers\/\nlayer\/\n  data\/\n    entity\/\n    repository\/\n  domain\/\n    model\/\n    translator\/\n    usecase\/\n    view_model\/\n  helper\/\n  infra\/\n    external\/\n    logger\/\n    mail\/\n    messages\/\n    oauth\/\n    payment_agent\/<\/code><\/pre>\n<\/div>\n<h3 id=\"i-1\">Data\u5c64<\/h3>\n<ul>\n<li>Entity\n<ul>\n<li>\u30e2\u30c7\u30eb\u307f\u305f\u3044\u306a\u3082\u306e<\/li>\n<\/ul>\n<\/li>\n<li>Repository\n<ul>\n<li>DB\u3068\u306e\u3084\u308a\u3068\u308a\u3092\u8a18\u8ff0\u3059\u308b\u5834\u6240<\/li>\n<li>create\u3001update\u306a\u3069\u306e\u30e1\u30bd\u30c3\u30c9\u304c\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 id=\"i-2\">Domain\u5c64<\/h3>\n<ul>\n<li>ViewModel\n<ul>\n<li>View\u5c64\u306e\u305f\u3081\u306e\u30c7\u30fc\u30bf\u69cb\u9020\u3092\u6301\u3064\u30af\u30e9\u30b9<\/li>\n<\/ul>\n<\/li>\n<li>Usecase\n<ul>\n<li>\u30a2\u30d7\u30ea\u306b\u304a\u3051\u308b\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\uff08\u30ed\u30b8\u30c3\u30af\uff09\u3092\u8a18\u8ff0\u3059\u308b\u30af\u30e9\u30b9<\/li>\n<li>Usecase\u306f\u4ee5\u4e0b\u306e\u6d41\u308c\u3067\u51e6\u7406\u3055\u308c\u308b\n<ul>\n<li>validate<\/li>\n<li>invoke<\/li>\n<li>finalize<\/li>\n<\/ul>\n<\/li>\n<li>\u6700\u7d42\u7684\u306b\u306fState\u3092\u8fd4\u3059\u3002State\u306fUsecase\u3092\u5b9f\u884c\u3057\u3066\u5f97\u3089\u308c\u305fViewModel\u304c\u683c\u7d0d\u3055\u308c\u308b<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u9020 Data\u5c64 Entity \u30e2\u30c7\u30eb\u307f\u305f\u3044\u306a\u3082\u306e Repository DB\u3068\u306e\u3084\u308a\u3068\u308a\u3092\u8a18\u8ff0\u3059\u308b\u5834\u6240 create\u3001update\u306a\u3069\u306e\u30e1\u30bd\u30c3\u30c9\u304c\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b Domain\u5c64 ViewModel View &#8230; <\/p>\n","protected":false},"author":1,"featured_media":8698,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[256],"tags":[],"class_list":{"0":"post-8697","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-it","8":"entry"},"_links":{"self":[{"href":"https:\/\/yumishin.com\/index.php?rest_route=\/wp\/v2\/posts\/8697","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yumishin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yumishin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yumishin.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yumishin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8697"}],"version-history":[{"count":1,"href":"https:\/\/yumishin.com\/index.php?rest_route=\/wp\/v2\/posts\/8697\/revisions"}],"predecessor-version":[{"id":8699,"href":"https:\/\/yumishin.com\/index.php?rest_route=\/wp\/v2\/posts\/8697\/revisions\/8699"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/yumishin.com\/index.php?rest_route=\/wp\/v2\/media\/8698"}],"wp:attachment":[{"href":"https:\/\/yumishin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8697"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yumishin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=8697"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yumishin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=8697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}