Ruby Gem 기여 사례 연구: activeadmin mongoid

6017 단어 railsactiveadminruby
This article is originally posted here. Checkout the article and related articles here.
Rails 개발에 관심이 많은 사람들에게는 한 프로젝트에서 Activeadmin을 사용해야 한다.없으면, have a look at it.은 매우 이해가 가는 지역사회 경영의 신기한 보석입니다.
Rails에 익숙하지 않은 사람들에게 이gem는 응용 프로그램의 모델을 신속하게 구축하는 관리 컨트롤러의 기능을 제공합니다.약정 세트를 제공하고 이 약정에 따라 작업을 하면 계기판을 신속하게 준비할 수 있습니다.Django에 익숙한 사람에게는 Django admin과 유사합니다.
gem activeadmin은 Rails activerecord을 사용하는 관계 데이터베이스와 잘 어울린다. NosQL 데이터베이스(예를 들어 Mongo)를 사용하는 프로젝트에 대해 같은 프레임 아래 또 다른 gem인 activeadmin-mongoid(https://github.com/activeadmin/activeadmin-mongoid)이 있다.

activeadmin mongoid 뒷이야기


ActiveAdmin은 Mongoid 지원을 핵심 ActiveAdmin 응용 프로그램에 도입하는 것을 미루고 있습니다.아마도 앞으로 activeadmin은 그gem을 통해 NosQL을 지원할 것입니다.
이gem의 리포는 Elia Schito 이전 작업에서 Active Admin 조직으로 끌어들인 것이다.현재 Grzegorz Jakubiak, Nic Boie, JD Guzman, Elia Schito와 기타 Active Admin, 커뮤니티 구성원들이 유지하고 있다.

activeadmin mongoid에 대한 빠른 기술 일별

Mongoid을 기반으로 한 Rails 프로젝트는 대부분 그 모델 방법에서 activerecord을 사용할 필요도 없고 이전할 필요도 없다. 왜냐하면 우리는 SQL 세계의 흔한 생각을 처리하지 않기 때문이다.
마찬가지로 gm의 activeadmin-mongoid도 Rails가 필요한 activerecord 관련 요소를 피했다.창업보드에 어떤 신제품을 내놓을 때 고려해야 할 문제다.(적어도 본문을 작성할 때)

질문

activeadmin-mongoidactiveadmin에 의존하고 생성기 호출, 예를 들어 rake activeadmin:install을 저장하여 초기값 설정 파일을 생성합니다.기본적으로 activeadmin은 설정 파일과db 이전 파일을 생성합니다.
우리가 언급한 바와 같이db 이전은 SQL 세계에서 효과적이지만, Mongoid를 고려하면 이 파일은 전혀 필요없고, 사용자가 생성한 후에 삭제할 필요가 없다. 왜냐하면 이것은 의미도 없고, 쓸모가 없기 때문이다.
한 사용자가 이 점을 지적하고 이에 대해 문제를 제기했다.https://github.com/activeadmin/activeadmin-mongoid/issues/137
그래서 좀 궁금해서 이 문제를 해결해 보고 싶어요.라인에서는 거의 토론이 없었다. Nic Boie에 한 관리자가 시도를 했고 그가 시도한 내용과 결과를 추가했다.이것은 내가 이 문제를 해결하는 첫 번째 방향을 확정하는 데 도움을 주었다.닉 덕분에!

해결을 향해 나아가다


이상적인 상황에서 닉 보이의 해결 방안이 이 문제를 해결했다.마이그레이션 파일 생성을 중지합니다.그러나 이 종류를 열고 이 방법을 다시 써서 아무 소용이 없도록 하려고 할 때, 그는 일부 파일을 요구해야 한다. 이 파일들은 Requires에 의존해야 한다. 그 중 하나는 activerecord 관련 파일을 가져왔다.그래서 지금 제 임무는 Nic와 똑같은 일을 하는 것이지만 activerecord이 어떠한 의존 호출이나 다른 방식으로 필요한 데이터를 얻지 못하게 하는 것입니다.
Nic가 제공하는 솔루션입니다.
require 'active_admin/mongoid'
require 'generators/active_admin/install/install_generator.rb'

ActiveAdmin::Generators::InstallGenerator.class_eval do

  # Make this a no-op so the AR migrations are not installed when ActiveAdmin-Mongoid is used.
  def create_migrations;end
end

activeadmingem 읽기


그래서 저는 activeadmingem을 읽고 Nic가 위에 class_eval을 사용하여 덮어쓰는 클래스를 확인했습니다.ActiveAdmin::Generators::InstallGenerator from here helped me 클래스를 배우고 현재 클래스를 이해하려면 activerecord 관련 파일이 필요하지만 이 클래스의 부류는 이런 파일이 필요하지 않습니다.
그래서 내가 생각해낸 해결 방안은 ActiveAdmin::Generators::InstallGenerator의 부류를 다음과 같이 바꾸는 것이다.
  • 한 종류가 그 종류에서 아들을 낳을 때 나는 자류의 묘사 방식을 바꾸어야 한다.
  • 다음에 다시 쓰는 방법을 정의하거나 다시 쓰는 것을 금지합니다.
  • 셀프.계승 방법


    루비는 inherited이라는 클래스에 아주 좋은 갈고리가 있는데, 한 클래스가 다른 클래스에 의해 자신을 파생시키는 데 쓰일 때 이 갈고리를 사용한다.inherited을 사용하면 파생류의 특정한 방식을 제어할 수 있다.멋있지 않아요?제가 심지어 여기에 트위터를 올렸어요.
    내가 유일하게 주의해야 할 것은 내가 스스로라고 생각하는 것이다.inherited를 호출하면 하위 클래스가 완전히 정의됩니다. create_migrations 방법의 정의를 삭제하거나 덮어쓸 수 있습니다.하지만 사실은 스스로가 되어야 한다는 것을 증명한다.inherited를 호출하면 사용자 정의 방법이 존재하지 않습니다.자기 뒤에만.계승이 완료되면 클래스는 모든 다른 사용자가 정의한 방법을 실현할 것입니다.😔

    셀프.메서드


    마찬가지로 루비는 예전과 같이 method_added이라는 갈고리를 제공해 주었고 클래스에 새로운 방법 정의를 추가할 때마다 이 갈고리를 호출했다.지금 어디로 가는지 보이시나요?self.inheritedself.method_added의 장점을 결합할 예정입니다.🤯

    문제를 해결하다


    그래서 우리의 다음 행동은 매우 간단하다.
  • 은 부류에 빈 create_migrations을 정의합니다.
  • 은 하나의 종류가 파생되었을 때, 우리는 self.method_added의 정의를 새롭게 정의하고 있다.고전적이죠?😎
  • 그러므로 파생 클래스의 이름이 ActiveAdmin::Generators::InstallGenerator이면 우리는 이 하위 클래스의 self.method_added을 새롭게 정의하여 create_migration
  • 의 방법 정의를 삭제할 것이다
  • remove_method은 이 클래스의 방법 정의만 삭제합니다. 따라서 파생 클래스는 현재 create_migration을 호출할 때 부모 클래스의 정의를 찾을 것입니다.
  • , 우리 부류에는 빈 조작 정의가 있습니다.

  • 이 동작을 실행할 때 activerecord와 관련된 항목이 필요하지 않습니다.
  • 빵!🎉🎉
  • 비밀 번호


    Rails::Generators::NamedBase.class_eval do
      def create_migrations
      end
      def self.inherited(klass)
        super
        if klass.name == "ActiveAdmin::Generators::InstallGenerator"
          klass.class_eval do 
            def self.method_added(method_name)
              super
              remove_method method_name if method_name == :create_migrations
            end
          end
        end
      end
    end
    

    이것은 나의 실현이다. PR은 여기(https://github.com/activeadmin/activeadmin-mongoid/pull/164)에 있고 아직 합병되지 않았다.3분의 2의 심사인이 심사에 통과했으니, 나는 그것이 비준과 합병을 얻을 수 있기를 바란다.

    좋은 웹페이지 즐겨찾기