Rails 어플리케이션 개발 후 10년 후 Hanami 사용
DHH
@dhh
2005년 원작'Rails로 15분 안에 블로그를 구축하는 방법'일명 wups영상: youtu.be/Gzj723LkRJY
2014년 7월 25일 오후 16:22
나는 즉시 Ruby on Rails에 반했다.앞으로 몇 년 동안 저는 Ruby on Rails를 공부하면서 Java 업무에 종사할 것입니다.결국 저는 자바에서 Rails로 진학하는 데 충분한 지식을 배웠고 그 후 10년 동안 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
조작을 허용하는 create
와index
조작이 같은 클래스에 있는 이유는 무엇입니까?하나미 방법은 단일 책임 원칙을 따른다.액션 클래스의 모든 코드가 이 노드와만 관련이 있다는 것을 확신할 수 있습니다.그것은 너의 행동을 매우 쉽게 테스트할 수 있게 한다.
응용 프로그램
하나미에 대해 내가 가장 좋아하는 또 다른 일은 여러 응용 프로그램이 당신의 업무 논리를 사용하고 다른 방식으로 그것을 나타낼 수 있다는 것이다.업무 논리는
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
저는 트위터에 있어요.
Reference
이 문제에 관하여(Rails 어플리케이션 개발 후 10년 후 Hanami 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mculp/using-hanami-after-a-decade-building-rails-apps-4jnl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)