Rails 어플리케이션 개발 후 10년 후 Hanami 사용

12728 단어 rubyrailswebdevhanami
나는 내가 처음으로 15분 동안 동영상에서 DHH 블로그를 보았을 때의 위치를 똑똑히 기억한다.당시 저는 주로 제 프로젝트에서 PHP를 사용했는데 제가 본 것은 깜짝 놀랐습니다.🤯

DHH
@dhh

2005년 원작'Rails로 15분 안에 블로그를 구축하는 방법'일명 wups영상: youtu.be/Gzj723LkRJY
2014년 7월 25일 오후 16:22
나는 즉시 Ruby on Rails에 반했다.앞으로 몇 년 동안 저는 Ruby on Rails를 공부하면서 Java 업무에 종사할 것입니다.결국 저는 자바에서 Rails로 진학하는 데 충분한 지식을 배웠고 그 후 10년 동안 Rails 응용 프로그램 개발에 힘썼습니다.
최근에 래일스가 아닌 하나미로 구축할 수 있는 부수적인 프로젝트가 생각났어요.내가 하나미를 선택한 이유는 몇 가지가 있다.
  • 저는 새로운 것을 배우고 싶은 여가 시간이 좀 있습니다
  • 나의 Rails 응용 프로그램은 최근에 대량의 작은 포로와 서비스 대상을 사용하는 추세
  • Hanami 응용 프로그램의 구조는 Rails
  • 의 자연스러운 발전처럼 느껴진다
    이 글에서 나는 너희들에게 내가 꽃향기에서 배웠고 매우 좋아하는 것들을 보여줄 것이다.

    항목


    미시시피주에서는 카운티당 전체 코로나19 환자 수와 사망자 수에 대한 최신 통계를 나열한 일일 표를 제공했다.

    이 표에는 전체 환자와 사망자만 나와 있어 카운티당 환자와 사망자의 일일 증가 상황을 알 수 없다.
    나는 매일 책상을 긁어버리고 오늘의 총수에서 어제의 총수를 줄여서 매일의 숫자를 얻기로 결정했다.

    나는 또한 매일 이 표를 저장하기 때문에 데이터의 역사적 보기도 있다.

    나는 현명을 counties 표에 저장했는데 두 번째 표의 이름은 county_updates이다. 아래와 같다.
  • cases
  • deaths
  • ltc_cases
  • ltc_deaths
  • county_id
  • previous_update_id 이것은 인용 외키
  • 입니다

    구현


    라이브러리 및 엔티티


    Hanami는 일반적인 Rails 모델을 저장소 클래스와 솔리드 클래스로 분할합니다.저장소 클래스는 데이터베이스 조회가 있는 위치이고 실체 클래스는 데이터의 표현 형식이다.실체류는 표 구조에서 자동으로 비치는 속성을 가지고 있다.
    나는 CountyUpdate 실체를 추가했고 자동 매핑 속성을 토대로 계산 방법을 추가했다.
    class CountyUpdate < Hanami::Entity
      def new_cases
        return unless previous_update
    
        cases - previous_update.cases
      end
    
      def new_deaths
        return unless previous_update
    
        deaths - previous_update.deaths
      end
    
      def new_ltc_cases
        return unless previous_update
    
        ltc_cases - previous_update.ltc_cases
      end
    
      def new_ltc_deaths
        return unless previous_update
    
        ltc_deaths - previous_update.ltc_deaths
      end
    
      def new_cases_percent_change
        return unless previous_update
    
        (new_cases.to_f / previous_update.cases.abs * 100).round(1)
      end
    end
    
    이런 방법의 장점 중 하나는 조회가 독립적이고 테스트하기 쉽다는 것이다.
    RSpec.describe CountyUpdateRepository, type: :repository do
      let(:repo) { CountyUpdateRepository.new }
    
      describe '#find_latest_by_county_id' do
        it 'finds the latest update for a county' do
          build_stubbed(:county, :with_updates)
    
          latest_date = repo.find_latest_by_county_id(1).date.to_date
          expect(latest_date).to eq Date.today
        end
      end
    end
    

    컨트롤러 계층


    하나미에서 각 노선은 하나의 동작류에 대응한다.이는 Rails와 달리 Rails의 각 라우트는 컨트롤러 클래스의 한 방법에 해당합니다.
    내 응용 프로그램에서, 나는 미시시피의 모든 현의 노선을 열거했다.
    get '/counties', to: 'counties#index'
    
    /counties 루트가 명중되었을 때 이 종류를 호출합니다.
    module Web
      module Controllers
        module Counties
          class Index
            include Web::Action
    
            expose :counties
    
            def call(params)
              @counties = CountyWithLatestUpdateRepository.new.all
            end
          end
        end
      end
    end
    
    마찬가지로 show 루트에 대해서도 상응하는 Show 조작이 있다.
    module Web
      module Controllers
        module Counties
          class Show
            include Web::Action
    
            expose :county
    
            def call(params)
              @county = CountyRepository.new.find_by_name_with_updates(params[:name])
            end
          end
        end
      end
    end
    
    나는 이런 방법을 매우 좋아한다.
    Rails 컨트롤러는 일반적으로 복잡하고 특정 작업과 관련된 코드만 포함합니다.예를 들어 코드가 params조작을 허용하는 createindex조작이 같은 클래스에 있는 이유는 무엇입니까?
    하나미 방법은 단일 책임 원칙을 따른다.액션 클래스의 모든 코드가 이 노드와만 관련이 있다는 것을 확신할 수 있습니다.그것은 너의 행동을 매우 쉽게 테스트할 수 있게 한다.

    응용 프로그램


    하나미에 대해 내가 가장 좋아하는 또 다른 일은 여러 응용 프로그램이 당신의 업무 논리를 사용하고 다른 방식으로 그것을 나타낼 수 있다는 것이다.업무 논리는 lib 디렉터리에 있습니다. app 디렉터리에 있는 여러 응용 프로그램에서 이 논리에 접근할 수 있습니다.새로운 Hanami 프로그램을 만들 때 서버 쪽 렌더링 프로그램이 app/web 에 있습니다.
    내가 정말 두 번째 프로그램을 만들어야만 프로그램이 얼마나 좋은지 완전히 이해할 수 있다.트위터에서 누군가와 잠시 소통한 뒤 API를 통해 이 프로젝트에 대한 데이터를 제공하자고 제안했다.app/api 빌더를 사용하여 hanami에 새 애플리케이션을 생성했습니다.
    bundle exec hanami generate app api
    
    그리고 나는 간단하게 JSON을 보여주는 컨트롤러를 추가했다.
    module Api
      module Controllers
        module Counties
          class Show
            include Api::Action
    
            def call(params)
              county = CountyRepository.new.find_by_name_with_updates(params[:name])
              self.body = JSON.dump(county.to_h)
              self.format = :json
            end
          end
        end
      end
    end
    
    나는 몇 분 안에 기능 API가 하나 생겼다.
    Rails와 달리 API는 순수한 플러스 코드입니다.나는 다른 내용 유형을 처리하기 위해 어떤 기존 코드도 사용할 필요가 없다.나는 어떤 respond_to 블록도 쓸 필요가 없다.만약 내가 생각한다면, 나는 JSON과 HTML 응답에 대해 두 개의 다른 검색어를 사용할 수 있으며, 분기 논리가 필요하지 않다.

    배달하다


    내가 하나미에 대해 가장 큰 수확은 나의 코드 품질이 나의 전형적인 Rails 프로젝트보다 향상되었다고 생각한다는 것이다.
    나는 Rails를 사용한 지 이미 십여 년이 되었는데, 때때로 나는 여전히 코드를 어디에 두어야 하는지 확실히 알기 어렵다."이 코드는 모델에 속합니까? 언제 모델 코드를 서비스 대상으로 이동해야 합니까?"나는 최근에 한 Rails 프로젝트에서 이런 상황을 만났다.결심하기 전에 모형과 포로 사이를 여러 번 왔다 갔다 하는 방법이 있었지만 여전히 결과에 만족하지 않았다.나는 결국 나의 손실을 줄이기로 결정했고, 단지 그것을 제자리에 남겨 두기로 결정했다.
    나는 하나미에서 이런 문제를 겪어본 적이 없다.이것은 거의 프레임워크가 코드의 질을 강화했다는 느낌을 준다.이것은 틀림없이 나쁜 코드를 작성하는 것을 더욱 어렵게 할 것이다.
    마법이 많지 않아요.이 틀은 너를 지도하기 위한 것이지, 너를 놀라게 하기 위한 것이 아니다.
    이 프로젝트의 결과는 나에게 깊은 인상을 남겼다.어떤 상황에서 나는 약간의 학습 곡선이 있지만, 나는 어려움을 극복할 수 있다.Hanami 2.0 is in the works 나는 그것이 무엇을 가져왔는지 보고 매우 기뻤다.

    부필.


    이 앱을 보고 싶으시면 heroku @ https://ms-covid-tracker.herokuapp.com/에서 실행됩니다
    코드는 ongithub
    저는 트위터에 있어요.

    좋은 웹페이지 즐겨찾기