Ruby on Rails 3를 사용하여 모듈을 만들고 사용하는 방법은 무엇입니까?


90

Ruby on Rails 3을 사용하고 있으며 모듈에서 일부 사용자 지정 및 공유 코드를 이동하고 싶습니다.

  1. 모듈 코드를 작성하려면 어떤 구문을 사용해야합니까?
  2. 내 응용 프로그램의 어느 폴더에 모듈 파일을 배치해야합니까?
  3. 하나 이상의 컨트롤러 클래스에 해당 모듈을 어떻게 포함시켜야합니까?
  4. 애플리케이션의 어느 곳에서나 사용자 정의 모듈을 사용해야하는 다른 조치 (있는 경우)는 무엇입니까?
  5. 내 애플리케이션에서 모듈의 메서드를 어떻게 호출 할 수 있습니까?

미리 감사드립니다.


2
아주 좋아요! 나는 그것을 필요로했다.
— Arup에 Rakshit

답변:


116

1. 모듈은 다음과 같이 간단히 생성 / 열기합니다.

module MyModule
  def first_module_method
  end
end

2. lib폴더. lib폴더 에서 모듈을 구성 하려면 모듈 자체에 넣을 수 있습니다. 예를 들어, 하위 폴더를 원하면 super_modules모듈은 다음과 같이 정의됩니다.

module SuperModules
  module MyModule
    def first_module_method
    end
  end
end

3./5까지. 클래스에 모듈을 포함 할 때 클래스 내에 정의 된 것처럼 모듈 메서드를 간단히 호출 할 수 있습니다.

class MyClass
  include MyModule
  def some_method
    first_module_method #calls module method
  end
end

4. 먼저, 모듈이 애플리케이션의 모든 클래스에 정말로 필요한지 확인하십시오. 그렇지 않은 경우에는 필요하지 않은 클래스를 부 풀리지 않도록 필요한 곳에만 포함하는 것이 합리적입니다. 모듈이 어디에나 있어야한다면 앱에서 클래스의 클래스 계층 구조를 살펴보세요. 모든 모델에서 모듈을 원하십니까? ActiveRecord :: Base를 열고 거기에 모듈을 추가 할 수 있습니다.


2
파일을 정리하기 위해 'lib'폴더에 하위 폴더를 만들 수 있습니까? 그렇다면 무엇이 변경됩니까?
— user502052

2
@ user502052 해당 질문에 답하기 위해 포인트 2에 대한 답변을 업데이트했습니다.
— Stephan

3
여기서 많은 것이 명확하지 않습니다. 제공 할 파일 이름은 무엇입니까? 모든 모듈을 포함하지 않을 때 메서드를 호출하는 방법은 무엇입니까? 마지막에 모듈을 사용하는 방법을 아직 모르기 때문에 너무 많은 찬성표가 있다는 것을 믿을 수 없습니다.
— Augustin Riedinger 2013 년

5
위와 같이 모듈을 lib폴더 에 포함시켜 생성 한 후에 는 Rails3가 config\application.rbfor 라인의 주석 처리를 해제 할 수 있도록하는 것이 중요합니다. config.autoload_paths예를 들어 stackoverflow.com/questions/1073076/rails-lib-modules-and ... 참고 또한 모듈 이름 자체와 일치하는 모듈의 파일 이름을 사용하도록주의해야합니다. 당신이 그것을에 저장 그래서 경우 lib/test/my_module.rb에, 당신은 include Test::MyModule참조 자세한 내용은 - stackoverflow.com/questions/4073856/rails-3-autoload
— sameers을

6
이 오래된 대답을 방금 찾았습니다. :( 찬성하고 싶습니다. lib에 아무것도 넣지 마세요! app/models코드가 다른 모델에 액세스해야하는 경우 코드 (추가 모듈 포함)를 넣으십시오 . 코드가 진정으로 '라이브러리'이고 자체적으로 존재할 수있는 경우, I gem 벤더 링을 제안합니다. 예를 보려면 github.com/shageman/the_next_big_thing
— Stephan

3

A> 1. 다른 루비 클래스와 동일한 구문을 사용할 수 있습니다. 예를 들어, 입력으로받는 바퀴 수에 따라 차량을 분류하기 위해 classify_vehicle 메서드를 사용할 VehicleClassifer 모듈을 정의하고 있습니다.

module VehicleClassifer
  def classify_vehicle(number_of_wheels)
    VehicleType.where("number_of_wheels = ?", number_of_wheels)
  end
end

A> 2. 모듈은 일반적으로 / lib 폴더에 저장됩니다.

질문 3,4,5는 거의 같은 답을 가지고 있습니다. 당신이 사용할 수있는

class SomeController < ApplicationController
  include VehicleClassfier

  def index 
    classify_vehicle(4)  
  end
end

클래스에서 모듈을 사용하고 있으며 모든 모듈의 메서드에 액세스 할 수 있습니다.

또한 앱을 통해 모듈을 사용해야하는 경우 애플리케이션 컨트롤러에 포함 할 수 있습니다.


2
나는 이것을 시도했고 정의되지 않은 메서드 오류가 발생했습니다. 내가 뭘 잘못하고 있는지 아십니까?
— Tony

모듈에 액세스 할 수 있습니까? stackoverflow.com/questions/6604272/… 도움이 될까요?
— Shreyas 2012-01-27

1
@Tony-모듈의 메서드를 사용하려면 개발 모드에서도 서버를 다시 시작해야 할 수 있습니다. 그리고 모듈의 코드를 변경할 때마다 서버를 다시 시작해야합니다. 예를 들어, 오류가 있거나 이전 코드에서 오류가 발생하지만 오류 메시지에서 해당 줄의 새 코드를 강조 표시하면 매우 혼란 스럽습니다.
— JosephK

내부에 사용자 정의 모듈을 포함하고 사용하는 방법에 대한 아이디어가 ApplicationHelper있습니까?
— WM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.