레일 모델 네임 스페이스 충돌을 해결하는 방법
-
20-09-2019 - |
문제
지금까지의 이야기:
"용어"라는 모델이있는 Rails 앱이 있습니다. 오이를 설치하려고 할 때까지 모든 것이 좋습니다. 달리면
rake cucumber
나는 얻다
Term is not a class (TypeError)
오이에는 또 다른 보석, '용어-분석기'(콘솔에서 멋진 색상 텍스트 출력을 수행하기 위해)가 포함되며, 용어 분석기는 "용어"라는 모듈을 정의하기 때문입니다. 오이에는 Rails 모델을 포함하기 전에 용어 분석 콜러가 포함되므로 "용어"는 "용어"모델을로드 할 때 이미 모듈로 정의됩니다. 최상위 모듈과 클래스는 루비에서 동일한 이름을 가질 수 없으므로 충돌이 발생합니다.
모델의 이름을 바꾸지 않는 것을 선호하면서, 나는 항아리 콜러 보석을 패치하는 것을 설정했습니다. 이것은 내가 생각했던 것보다 더 어려웠다. 모듈 이름이라는 용어 이름을 "ansiterm"으로 변경했지만 오이가 수정 된 보석을로드하는 방법을 알 수는 없습니다.
어떤 아이디어? 내가 잘못된 나무를 짖고 있습니까?
해결책
두 가지 솔루션 :
1) 앱의 용어 모델을 다른 것으로 변경하십시오.
2) 패치 용어 분석 콜러는 네임 스패닝 용어를 갖고 대신 그 보석을 사용합니다.
다른 팁
내가 한 일은 다음과 같습니다.
sudo gem uninstall term-ansicolor
sudo gem uninstall cucumber
Github에서 용어 분석 및 오이의 소스를 다운로드하십시오
용어 분석용 소스를 검색하십시오 "module Term"
그리고 대체하십시오 "module ANSITerm"
오이 소스를 검색하십시오 "include Term"
그리고 대체하십시오 "include ANSITerm"
오이 소스를 검색하십시오 "::Term"
그리고 대체하십시오 "::ANSITerm"
sudo gem install term-ansicolor
내 지역 저장소에서
sudo gem install cucumber
내 지역 저장소에서
이제 유지해야 할 두 가지 보석이 있지만 앱의 모든 모델 참조를 변경하는 것보다 쉽습니다.
의견/제안을 환영합니다.
내 애플리케이션 모델 노드와 CapyBara :: 노드와 네임 스페이스 충돌을 받았습니다. 문제를 해결하기 위해 사양에 Toplevel 네임 스페이스를 명시 적으로 진술하는 것으로 충분했습니다.
it "should find the specified node scoped under the current user" do
::Node.should have_received(:find_by_id_for_user).with(node.id, user)
end