Rails의 configeager_load의 영향으로 인한 오류

5555 단어 RubyRails
자신을 일깨우는 동시에 걸려 넘어진 사람이 바로 문제를 해결할 수 있도록 필기를 해야 한다.

발생한 문제


다음 controller와view가 있습니다.(관리자 화면 요약)
sysadmin_users_controller.rb
class SysadminUsersController < ApplicationController
 def index
  @sysadmin_users = SysadminUser.order(updated_at: :desc)
 end
end
index.html.slim
= "#{@sysadmin_users.count}件"
table
 thead
  tr
   th | 氏名
   th | メールアドレス
   th | 最終更新日
 tbody
   - @sysadmin_users.each do |sysadmin_user|
    td = sysadmin_user.name
    td = sysadmin_user.email
    td = l(sysadmin_user.updated_at, format: :short)
위의 URL (/systadmin users) 을 방문하면 개발자 환경은 문제가 없지만, Staging 환경에서는 index가 사용됩니다.html.slim의count는nometthod error로 바뀌었다

오류의 발생 원인과 해결 방법


개발자 환경과 Staging 환경에 따라 오류가 발생하거나 다르기 때문에 환경에 따라 오류의 원인을 확인하고 싶습니다.

1. 데이터베이스의 차이


개발자 환경과 Staging 환경에서 읽는 데이터베이스가 다르기 때문에 Staging 환경의 데이터베이스를 개발자 환경에 가져와 같은 표 상태로 만듭니다.

결실


오류 원인을 알 수 없습니다. 개발자 환경에 오류가 발생하지 않았습니다.

2.config 파일의 차이점


환경마다 다른 것은 app:config>environments 아래의 파일입니다.
development.rb와 Staging.rb로 다른 곳을 찾으면 수상한 점이 있어요.
development.rb
 config.eager_load = false
staging.rb
 config.eager_load = true
development.rb를 config.eager_load = true로 바꾸기
Staging 환경과 같은 오류가 발생했습니다!

config.eager_로드란?


@shakemurasan선생님의 글은 이해하기 쉬우니 여기를 참고하세요.
https://qiita.com/shakemurasan/items/305bd3d78d67b646bc06
config.eager_load를 진짜로 설정하면 controller와 모델 등class 이름을 미리 읽습니다.(rails 서버가 시작될 때일 수도 있음)
따라서 페이지를 읽을 때마다class를 읽을 필요가 없기 때문에 읽는 속도가 빨라집니다.
한편, config.eager_load를 가짜로 설정하면 페이지의 읽기 속도가 느려지지만 rails 서버의 시작 속도가 빨라집니다.
참고로 개발자 환경의config입니다.eager_load를 가짜로 설정한 것은staging과 달리 원본 코드가 빈번하게 변경되어 rails 서버를 다시 시작할 때마다 개발자 환경에서 브라우저 테스트를 하기 때문이다.

왜 config?eager_load 설정에 오류가 발생했습니까?


namespace (class 이름) 를 미리 모두 읽으면 오류가 발생하고, 페이지에 접근할 때 특정한class를 읽으면 오류가 발생하지 않습니다.
응?설마 같은 namespace(class명)가 존재하는가?
SysadminUsersController 전체 텍스트 검색을 사용하면 있습니다!같은namespace(class명)!
users_controller.rb
class SysadminUsersController < ApplicationController
 def index
 end
end
충격적인 일은 두 가지다.
1. users_분명히 controller이지만,class의 이름은 SysadminUsersController입니다
2. 이 파일은 전혀 사용되지 않았습니다.
파일 삭제 후 순조롭게 해결

향후 대책


config.eager_로드를 이해하는 계기가 됐지만.다음은 다시 한번 마음에 새기겠습니다.
1. 모든 환경에 오류가 있으면 app&config>environments에 속하는 파일을 확인합니다.송이경(신지현):됐어.
2.controller명과class명 통일
2. 사용되지 않은 파일 삭제(controller에만 한정된 것이 아니다) (나중에 사용할 수 있는 파일이 있을 수 있지만 오류가 발생할 수 있음)

최후


이번 오류의 원인은 개발 경력이 반년이 넘은 사람에게는 당연한 일일 수도 있지만, 초반 멤버에게는 당연하다.팀 개발은 현재 최초 멤버가 없어도 앞으로 나올 수 있기 때문에 문서에 잘 담아 규칙화하고 주의를 환기하고 싶다

좋은 웹페이지 즐겨찾기