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.