Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

루비 보석은 어떻게 작동합니까?

Rails를 사용하는 것이 좋은 이유 중 하나는 일반적인 프로그래밍 요구 사항(승인, 사이트 관리, 전자 상거래)에 대해 문제에 대한 솔루션을 코딩하고 패키징했을 가능성이 있는 것보다 더 똑똑한 사람에게 이름을 지정한다는 것입니다. 보석의 형태로.

Gemfile에 보석을 추가하고 보석의 작동 방식을 제대로 이해하지 않고도 보석의 유용성을 최대한 활용할 수 있지만 이 모든 것이 어떻게 연결되는지 궁금하신가요?

여기에서 Ryan Bates의 CanCan 인증 gem을 자세히 살펴보고 다음 질문에 답할 것입니다(더 광범위하게 묻는 경우 모든 gem에 적용될 수 있음).

  1. CanCan의 코드는 어디에 저장되나요?

  2. can?은(는) 어디에 있습니까? 정의된 방법?

  3. Rails는 언제/어디서/어떻게 CanCan 코드를 로드합니까?

먼저 Gemfile에 CanCan이 있고 bundle install를 수행합니다. :

# Gemfile
gem "cancan", "~> 1.6.10"```

$ bundle install

Bundler를 사용하면 특정 보석이 어디에 있는지 실제로 쉽게 확인할 수 있습니다. bundle show를 사용하세요. :

$ bundle show cancan
/Users/jasonswett/.rvm/gems/ruby-2.0.0-p0/gems/cancan-1.6.10

그것은 질문 # 1을 처리합니다. 이제 can?은(는) 어디에 있습니까? 정의?

$ cd /Users/jasonswett/.rvm/gems/ruby-2.0.0-p0/gems/cancan-1.6.10
$ grep -r 'def can?' *
lib/cancan/ability.rb: def can?(action, subject, *extra_args)
lib/cancan/controller_additions.rb: def can?(*args)

실제로 두 개의 다른 can?이 있는 것 같습니다. 기능. 우리가 관심 있는 것은 lib/cancan/ability.rb입니다. .

# lib/cancan/ability.rb

def can?(action, subject, *extra_args)
match = relevant_rules_for_match(action, subject).detect do |rule|
rule.matches_conditions?(action, subject, extra_args)
end
match ? match.base_behavior : false
end

여기에서 실제로 일어나는 일에 관한 한 당신의 추측은 나만큼 훌륭하지만 중요한 부분은 아닙니다. 여기서 중요한 점은 gem에 문제가 있는 경우 이제 gem의 코드를 파헤쳐 무슨 일이 일어나고 있는지 알아낼 수 있다는 것입니다.

이제 gem의 코드가 보관되는 위치와 그 안에 들어가는 방법을 알았으므로 Rails는 gem에 대해 어떻게 알고 언제 gem의 코드를 로드하나요?

이것은 Rails 초기화 문서의 특정 섹션에서 다룹니다. 관련 부분은 다음과 같습니다.

표준 Rails 애플리케이션에는 애플리케이션의 모든 종속성을 선언하는 Gemfile이 있습니다. config/boot.rb는 ENV['BUNDLE_GEMFILE']을 이 파일의 위치로 설정합니다. Gemfile이 있으면 번들러/설정이 필요합니다.

이것은 초기화 프로세스의 초기에 발생합니다. 정확히는 두 번째 단계입니다. 프로젝트가 특정 gem에 의존하고 있다면 누가 그것을 참조할 수 있는지 알고 있기 때문에 이것은 의미가 있습니다. 코드를 어디서나 사용할 수 있도록 최대한 빨리 로드하는 것이 좋습니다.