2017-03-18 8 views
0

내가 다른 파일에 선언 한 모듈에 액세스하는 데 문제가 있습니다. 개념적으로이 권한이 있는지 궁금합니다. 설명하겠습니다.요구 범위

그래서

정보 파일

module HelloWorld 
    def greet 
    "hello world" 
    end 
end 

파일 b는

require "a" 

파일 C

require "b" 
include HelloWorld 

puts greet 

그래서 a -> b -> c

같은, b와 c 설치 파일이있는 경우 ,이 작업?

이제 어떻게 내가 이런 식으로

정보 파일

module HelloWorld 
    def greet 
    "hello world" 
    end 
end 

파일 B

include HelloWorld 

puts greet 

파일 c 아무것도 변경

require "a" 
require "b" 

겠습니까을한다면? 그것은 나에게, 보석 - 한 번 필요 - 어떤 파일에 상관없이 액세스 할 수 있지만 두 번째 시나리오에서 모듈에 액세스하는 데 문제가 있습니다. 어떤 도움을 주셔서 감사합니다.

업데이트 : 나는 두 시나리오를 모두 테스트했으며 둘 다 작동합니다. 이는 개념적 문제가 아니라 내 코드의 버그라고 생각합니다. 나는 프로젝트 디버깅 작업을 할 것이다. 난 당신의 코드를 실행하려고하면

+0

있습니다. 나는 require에'. /'를 추가하지 않았다. –

답변

1

나는 단순히는 Kernel's require method 이는 a.rb 파일을 찾을 수 없습니다 사용하고 제기 및 LoadError 예외 있음을 말하고있다

$ ruby c.rb 
~/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- a (LoadError) 
    from /Users/Sonna/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
    from c.rb:2:in `<main>' 

다음과 같은 오류 메시지를 얻을.

파일을 필요로하기 위해 당신은 Kernal's require_relative method

require_relative "a" 
require_relative "b" 

을 사용할 수 있으며, 그것은 것입니다 그 a & bc 파일에 상대적 파일.

아니면 자신의 사용자 정의 스크립트를로드 할 루비 보석에 사용되는 행해지고 있습니다 귀하의 c.rb 파일에 다음 코드 줄을 추가 할 수 있습니다/라이브러리

current_directory = File.expand_path("../", __FILE__) 
$LOAD_PATH.unshift(current_directory) unless $LOAD_PATH.include?(current_directory) 

이에서 현재 디렉토리 ../를 추가합니다 현재 파일 __FILE__, 은 현재 디렉토리의 aboslute 경로가되도록 확장하고 기존로드 경로 전역 변수 에 추가합니다. 예 :내부적으로는

$ ruby c.rb 
hello world 

다음 내가 다시 당신에게 코드를 실행하면

If the filename does not resolve to an absolute path, it will be searched for in the directories listed in $LOAD_PATH ($:) .

-- Kernel's require method

그래서 내가 볼 절대 경로를 지정하지 않은 경우, 파일 이름으로 찾기 위해 사용 require

puts $LOAD_PATH 
# => ["~/Projects/ruby/stackoverflow_questions/the_scope_of_require", 
#  "/usr/local/Cellar/rbenv/1.0.0/rbenv.d/exec/gem-rehash", 
#  "~/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/did_you_mean-1.0.0/lib", 
#  "~/.rbenv/versions/2.3.1/lib/ruby/site_ruby/2.3.0", 
#  "~/.rbenv/versions/2.3.1/lib/ruby/site_ruby/2.3.0/x86_64-darwin15", 
#  "~/.rbenv/versions/2.3.1/lib/ruby/site_ruby", 
#  "~/.rbenv/versions/2.3.1/lib/ruby/vendor_ruby/2.3.0", 
#  "~/.rbenv/versions/2.3.1/lib/ruby/vendor_ruby/2.3.0/x86_64-darwin15", 
#  "~/.rbenv/versions/2.3.1/lib/ruby/vendor_ruby", 
#  "~/.rbenv/versions/2.3.1/lib/ruby/2.3.0", 
#  "~/.rbenv/versions/2.3.1/lib/ruby/2.3.0/x86_64-darwin15"] 

주목해야한다.

A file will not be loaded again if its path already appears in $" . For example, require 'a'; require './a' will not load a.rb again.

-- Module: Kernel (Ruby 2_4_0)

require 메서드 중 하나가 해당 파일이 호출 된 의 메서드 중 하나가 나오기 전에 한 번 발생하면 작동해야합니다. 그래서 당신의 예제 모두 (긴 디렉토리 중 하나로 농성이 $LOAD_PATH에 추가 또는 당신은 require_relative 대신 사용) 작동에 대한 답변 중 하나에 언급 된 코드에서 버그가

+0

1 분 전에 직접 테스트했을 때 실제로이 사실을 알았습니다. [실제 코드는 다음과 같습니다] (https://github.com/space-hanger/apollo-8). 그래서 나는'app/controllers/application_controller.rb'를 가지고 있고'require "./app/helpers/helpers"와'require "./app/models/user"'를 가지고 있습니다. 내가 응용 프로그램 컨트롤러에서'app/helpers/helpers' 모듈을 액세스하려고하면 작동하지만'app/models/user'에서 시도하면 실패합니다. 나는'require "./app/helpers/helpers"'를'app/models/user'에 추가함으로써 그것을 고쳤습니다. 그러나 이것을 할 필요는 없습니다. 개념적으로 이는 시나리오 b와 일치합니다. –

+0

죄송합니다. 질문에 원래 소스 코드를 게시했을 것입니다. –

+0

샘플 앱 코드를 보면 'send_text'도우미 메소드가 설명하는 문제를 일으키는 것으로 보입니다. 나는 "사용자 모델 (특히 모델이 아직 저장되지 않은 경우)에 '전화'속성을 설정할 때마다 SMS를 보내는 것이 좋은 생각입니까?" 또한, 당신은 이미 재발행 확인 코드에서 'send_text'를 사용하는 것처럼 보이지만 API 대신 사용자 컨트롤러 액션 (또는 익숙한 사용자 폼 객체 저장 메소드)의 생성 또는 업데이트시이를 사용할 수 있습니다 모델로부터의 호출. 그것은 정말로 달려 있으며 응용 프로그램 내에서 호출 할 곳에 달려 있습니다. – sonna