rails 플러그인을 어떻게 씁니까

어떻게 간단한 플러그인을 실현합니까?다음은 모델에서 Hello World를 출력할 수 있는 플러그인입니다.주: () 중의 사체는 본인의 소감이므로 소홀히 해서는 안 된다.
 
첫 번째 단계는 프로젝트 디렉터리에 새 플러그인을 만들고 실행하기
rails generate plugin HelloWorld

이 명령은 다음 디렉토리 파일을 생성합니다.
      create  vendor/plugins/hello_world
      create  vendor/plugins/hello_world/MIT-LICENSE
      create  vendor/plugins/hello_world/README
      create  vendor/plugins/hello_world/Rakefile
      create  vendor/plugins/hello_world/init.rb
      create  vendor/plugins/hello_world/install.rb
      create  vendor/plugins/hello_world/uninstall.rb
      create  vendor/plugins/hello_world/lib
      create  vendor/plugins/hello_world/lib/hello_world.rb
      invoke  test_unit
      inside    vendor/plugins/hello_world
      create      test
      create      test/hello_world_test.rb
      create      test/test_helper.rb

이 안에서 비교적 중요한 파일은 바로 init이다.rb 및 lib/helloworld.rb, 플러그인이 불러올 때 init.rb는 먼저 불러오고 초기화되며lib는 코드 라이브러리를 실행합니다.
 
2단계, lib에서 hello 편집world.rb 파일, Hello World 출력을 위한 방법 정의say
hello_world.rb:
module HelloWorld
   def say
     p 'Hello World!'
   end
end

 
세 번째 단계는 플러그인이 완성되었습니다. 다음은 모델에서 이 플러그인을 사용하십시오.init.rb 파일에 추가
init.rb:
ActiveRecord::Base.send(:include, HelloWorld)

이렇게 하면 모든 모델이 HelloWorld에 섞여있고 say 방법도 모델의 실례적인 방법이 된다.
(이렇게 하면ActiveRcord:Base에HelloWorld 모듈이 섞이고 모델은ActiveRecord::Base에 계승되기 때문에 모델은HelloWorld의 정적 방법을 직접 호출할 수 있습니다.send가 보낸 메시지는 프로그램이 실행될 때 변할 수 있고 send는module나 클래스의private 방법을 열 수 있어 더욱 유연하게 사용할 수 있습니다.)
model에서 사용, post.rb:
class Post < ActiveRecord::Base
end
 
콘솔에서 결과를 보려면 다음과 같이 하십시오.
1.8.7 :001 >  Post.new.say
"Hello World!"
 => nil 

문제 없어요!간단한 플러그인 하나로 완성되었지만 Hello World의 방법은 모든 모델에 열려 있습니다. 만약 그렇지 않다면 이렇게 쓸 수 있습니다.
hello_world.rb:
module HelloWorld
   def self.included(base)
     base.extend(ClassMethods)
   end
   
   module ClassMethods    
      def hellolize 
        include HelloWorld::InstanceMethods
      end                  
   end
 
   module InstanceMethods
     def say
       p 'Hello World!'
     end
   end
end

 
(HelloWorld 모듈이include일 때 방법included가 호출되고 혼합된 클래스의 이름이 전송되며 extend 방법이 호출되면 ClassMethods 모듈의 방법은 혼합된 클래스의 방법이 되어 바로 호출될 수 있습니다. Hellolize 방법이 호출될 때 InstanceMethods는 혼합된 클래스의 실례적인 방법이 됩니다. 이렇게 하면 어느 모델에서say 방법을 사용하고 싶은지 장점이 있습니다.어느 모델에서hellolize 방법을 호출하면 방법의 안전성을 확보한다)
init.rb:
ActiveRecord::Base.send(:include, HelloWorld)

model에서 사용, post.rb:
class Post < ActiveRecord::Base
  hellolize
end

 
콘솔에서 결과를 보려면 다음과 같이 하십시오.
1.8.7 :001 > Post.new.say
"Hello World!"
 => nil 

 
이상은 실현 과정일 뿐 실제 상황에 따라 중복 기능 코드를 플러그인으로 작성해서 사용할 수 있다.
물론 완전한 플러그인은 완전한 검증과 테스트를 가지고 있으며, 이 예는 순전히 연습용으로 제공되며, 참고로만 제공된다.
 
여기에 비교적 좋은 예가 하나 있다.

좋은 웹페이지 즐겨찾기