Ruby on Rails에서 String 클래스를 확장하려면 코드를 어디에 넣어야합니까?


79

Ruby on Rails에서는 다음과 같은 메서드를 추가해야합니다.

class String
  def capitalize_first
    # ...
  end
end

파일이 어디로 이동해야하는지 궁금하십니까? (어떤 디렉토리와 파일 이름, 필요한 초기화 코드가 있습니까?) 이것은 Rails 3.0.6 프로젝트 용입니다.

답변:


140

나는 항상 core_ext내 디렉토리에 디렉토리를 추가합니다 lib.

사용자 지정 확장을로드하기 위한 이니셜 라이저 를 만듭니다 (예 :) config/initializers/core_exts.rb. 그리고 그 안에 다음 줄을 추가하십시오.

Dir[File.join(Rails.root, "lib", "core_ext", "*.rb")].each {|l| require l }

확장 기능은 다음과 같습니다.

lib/core_ext/string.rb

class String
  def capitalize_first
    # ...
  end
end

String클래스를 확장해야 할까요 아니면 헬퍼 메소드를 뷰에서 사용해야할까요? 이 헬퍼 경우하지만, 다음은 컨트롤러 (모델)에서 작동하는 것도 골칫거리이며, 그것은 같은 체인 수 없습니다s.capitalize_first.truncate(30)
nonopolarity

14
내 무지를 용서하십시오. "초기화 구성"감사의 예를 들어 주
Brian

15
나는 그것을 config / application.rb에 class Application < Rails::Application ... config.autoload_paths += Dir[File.join(Rails.root, "lib", "core_ext", "*.rb")].each {|l| require l } ...
넣었다

5
확장자를 안에 넣으면 파일 상단에 lib/core_ext/string.rb포함하는 것을 잊지 마십시오 require 'core_ext/string'.
Rok Strniša

1
@moondaisy 당신이 틀 렸습니다. lib디렉토리는 디렉토리 안에 있으면 안됩니다 app.
Fabrizio Bertoglio

66

config / initializers / string.rb에서 할 수 있습니다.

class String
  def capitalize_first
    # ...
  end
end

앱을 다시 시작하는 것 외에 필요한 모든 것입니다.


1
이 확장에 대한 테스트 파일을 어디에 추가 하시겠습니까?
konyak

3
네, 가장 쉬운 방법입니다. 그러나 개발을 변경할 때이 클래스를 다시로드하기위한 지원을 잃게됩니다.
Josh

5

Rails 3.1의 가이드 라인은 다음과 같습니다.

http://guides.rubyonrails.org/plugins.html#extending-core-classes

기본 규칙을 따르면 초기화 설정을 엉망으로 만들 필요가 없습니다.


1
이 방법은 확장 프로그램을 즉시로드하지 않습니다. 모듈 / 클래스 이름 (이 레일 가이드에서 Yaffle)을 호출 한 후로드합니다. 이는 모듈 이름 (Yaffle)이 먼저 호출 될 때까지 확장 메서드를 호출 할 수 없으며 이니셜 라이저에서이 모듈 이름을 정의 할 수 없음을 의미합니다. 콘솔에서 테스트했으며 autoload_paths가 작동하는 방식입니다. config / initializers / 또는 config / application.rb에서 확장 파일을 요구하는 것이 가장 좋은 옵션입니다.
konyak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.