2013-03-07 1 views
33

비표준 루비 파일을 어디서 Rails 앱에 넣어야하는지, 모범 사례가 없는지, 기본 디렉토리 (controllers/models 등).어디서나 들어갈 수없는 레일즈 애플리케이션에 클래스를 넣을 위치에 대한 지침

저는 컨트롤러/모델 등에서 사용되는 클래스에 대해 이야기하지만 레일스 기반 클래스의 서브 클래스는 아닙니다. 모델에서 추출한 기능을 포함하여 덜 뚱뚱하게 만드는 클래스입니다. 모델 중 일부는 AR 모델이 아니지만 일부 모델은 "서비스"처럼 보이고, 일부는 그 사이 또는 다른 것입니다.

몇 랜덤 예 : PARAMS하거나 PARAMS의 처리를하는 "XCreator"객체를 캡슐화 오브젝트 등

  • "XParams"북을 통해 비밀번호 인증을 처리

    • "전략"클래스 마지막에 일부 AR 모델을 생성하는 복잡한 작업을 수행합니다.
    • 외부 API에 대한 요청을하거나 해당 요청과 응답을 캡슐화하는 클래스
    • 실제 AR 모델 대신 사용할 수있는 가짜 모델 (예 : guest us
    • Resque 작업
    • 저장 레디 스로부터 정보를 판독 등의 보고서를 생성하는 데이터 처리와 같은 일부 특정 작업을 실행
    • 클래스 및 Resque 작업 또는 퀴 작업에서 호출
    • 클래스) ER

    나는 지금 꽤 많은 것을 가지고있다. 그들 중 일부는 lib에 추가되어 임의의 클래스와 모듈 더미로 끝나고, 어떤 것은 app/models에 몰래 들어간다. 나는 어떻게 든 이것을 조직하고 싶습니다만, 나는 어디서부터 시작해야할지 모르겠습니다.

    AR 모델 만 app/models에 들어가야합니까? 또는 도메인이나 도우미 모델을 배치해도 괜찮습니까? 어떤 것이 모델인지 어떻게 결정합니까?

    app에 맞지 않는 모든 항목은 lib으로 들어가야합니까? 또는 app에 몇 가지 새로운 사용자 정의 하위 디렉토리를 추가해야합니까? 하위 디렉토리는 무엇이며 어떻게 맞춤 클래스를 나눕니 까?

    프로젝트에서 어떻게 처리합니까? 나는 모든 프로젝트가 조금 다르다는 것을 알고 있지만 몇 가지 유사점이 있어야합니다.

  • +1

    더 많은 답변을 원한다. – carbonr

    +1

    @ carbonr CodeClimate 기사가 내가 찾은 최고의 것이고, 나는 그것을 받아 들였다. "MyTurtleFaceSpace"규칙은 따라야 할 좋은 규칙입니다. 나는 또한 나중에 이것에 대한 후속 기사를 썼다 : http://blog.lunarlogic.io/2013/declutter-lib-directory/ –

    답변

    12

    좋은 질문 - 난 당신

    에 대한 구체적인 답변을하지 않습니다하지만 난이 게시물을 을 확인하는 것이 좋습니다 - http://blog.codeclimate.com/blog/2012/02/07/what-code-goes-in-the-lib-directory/ - 현재 프로젝트의 모든 의견

    을 통해 읽으십시오 난 응용 프로그램/모델에서 비 ActiveRecord 객체 톤이 있지만 작동하지 않지만 이상적입니다. lib에서 응용 프로그램 특정 코드가 아닌 재사용 가능 코드를 사용합니다.

    다른 프로젝트에서 시도한 다른 방법 명령 개체의) 이 응용 프로그램에서 네임 스페이스에 올 때 레일 고통, 그것은 SRC 또는 APP_NAME 디렉토리

    app/ 
        src/ 
        commands/ 
         create_product.rb   # Commands::CreateProduct 
         update_product_price.rb # Commands::UpdateProductPrice 
    

    나는 천국에서 레일 외에 기본적으로 같은 공간에

    app/ 
        commands/ 
        products/create_command.rb   # Products::CreateCommand 
        products/update_price_command.rb # Products::UpdatePriceCommand 
    

    다른 모든 것을 모든 업로드 이상적으로는 두 번째 앱이 더 좋지만 애플리케이션 아래에 추가 디렉토리가 없으면 앱을 열고 컨트롤러, 명령, 모델 등을 볼 수 있습니다.

    +2

    CodeClimate 링크 +1, 지금까지 본 적이있는이 자료가 제일 좋다. 이야기. –

    +2

    http://stackoverflow.com/questions/1068558/oo-design-in-rails-where-to-put-stuff에서 허용되는 답변도 매우 잘 작성되었습니다. – sameers

    2

    모든 모델 클래스 (예 : STI 서브 클래스)는 apps/models에 위치합니다. 나는 다른 반을 lib에 넣는다. 그것들을 놓는 가장 좋은 장소 인 것처럼 보인다. 어디에서 봐야할지 쉽게 알 수 있습니다. 내 모델 클래스가 모두 한 곳에서 이루어지기 때문에 테스트를 그룹화하는 것이 더 쉽습니다.

    컨벤션별로 나는 도우미 클래스를 app/models에 넣는 것을 싫어합니다. 발표자 클래스 인 경우 app/helpers에 속합니다. 그들이 그렇지 않다면 lib은 그들을위한 최고의 장소 인 것처럼 보입니다.

    1

    가끔 내 수업은 서브 디렉토리와 동일한 이름을 가진 모듈이 서브 디렉토리를 포함하는 서브 디렉토리에서 lib으로 들어갑니다. (레일즈는 오토로더의 경우 파일 이름과 클래스 이름에 매우 민감합니다.)

    또 다른 옵션은 각 모듈을 자체 보석으로 캡슐화 한 다음 Gemfile을 통해 보석을 참조하는 것입니다. 이를 통해 프로젝트간에 코드를 공유 할 수 있습니다.

    7

    당신은 다른 사용 사례의 수에 접촉, 나는이 부분이 "오른쪽"대답에 가장 가까운이라고 생각 : 지금이 꽤 많이있어

    , 그들 중 일부 lib에 추가되어 임의의 클래스 및 모듈 더미로 끝나고 일부는 앱/모델로 몰래 빠져 든다. 나는 어떻게 든 이것을 조직하고 싶습니다만, 나는 어디서부터 시작해야할지 모르겠습니다.

    제 책에서 꽤 옳습니다. 당신이 언급하지 않은 한가지는 다양한 조각들을 각각의 보석으로 추출하는 것입니다. 외부 서비스와 대화하는 클래스는 충분히 추출 할 수있는 전략 클래스와 마찬가지로 추출을위한 훌륭한 후보입니다. 자신 만의 보석 서버를 운영하는 것은 그리 어렵지 않기 때문에 비공개가 될 수 있습니다. 그러면 분명히 ROR 앱에서 재사용 할 수 있습니다.

    마지막으로 가장 구체적으로 말하자면, 리졸 브 작업은 lib/jobs에 포함됩니다.

    나의 어법은 어떤 종류의 인 경우 일 경우, app/models이됩니다. 그렇지 않은 경우에는 아마도 lib 또는 적절히 명명 된 서브 디렉토리에 속할 것입니다. lib/jobs, lib/extensions, lib/external 등이있다.

    관련 문제