2011-09-17 3 views
4

질문 1 :

레일스 작업 (메소드)의 인스턴스 변수 범위는 무엇입니까? 서버에 대한 각 연결이 컨트롤러의 새로운 인스턴스를 형성합니까? 예를 들어Ruby 인스턴스와 레일스 관련 전역 변수

:

  • User_A이 @randInt라는 임의의 인스턴스 변수를 일으키는 '세터'페이지를로드가 발생합니다.
  • User_B (다른 PC의 다른 PC)가 @randInt을 요청하는 'getter'페이지를로드합니다.

User_B는 User_A가 설정 한 @randInt을 검색할까요? 또는 User_A의 연결에 고유 한 인스턴스 변수입니까?

질문 2 :

질문 2 질문 1, 대신 @@randInt를 사용하는 것과 같습니다. 질문 2의 답변이 "예, 두 사용자 모두이 값을 볼 수 있습니다."라고 가정하면 여러 사용자가 공유하려는 임시 데이터를 Rails의 전역 변수를 사용하여 저장하는 것이 허용되는 방법입니까? 고급의

감사합니다,

데릭

답변

2

질문 1 : 아니, 인스턴스 변수가 있으므로이 '예'는 컨트롤러의 인스턴스를 참조하는 예를, 만 공유하고 있습니다 변수는 하나의 요청 만 계속합니다 (따라서 User_B는 다른 @randInt을 받게됩니다).

질문 2 : : @@ 변수는 글로벌 변수가 아니며 $ variables are입니다. @@은 클래스 변수입니다. 링크에서 설명하는 것처럼 다른 기계 인스턴스 (예 : FCGI를 사용하는 경우)는 이 아니며 변수는 전역 변수 ($)를 공유하지 않으므로 사용하지 마십시오.

상수이 필요하면 config로 설정하십시오. 아마도 전역 변수가 데이터베이스에 남아있을 가능성이 더 큽니다 (사이트 설정과 같은 사용법을 볼 수 있지만 데이터베이스와 함께 사용하는 것이 가장 적합하다고 생각됩니다).

클래스 변수를 persistant instance variables으로 사용할 수 있지만 다시 클래스를 다시로드 할 때 (즉 모든 클래스 변수를 재설정하는 경우) 보장 할 수없는 값을 저장하는 데 데이터베이스를 사용하는 것이 좋습니다.

+0

감사합니다. 이것은 나를 위해 그것을 정말로 깨끗하게한다! – Derek

+1

실제 세션과의 혼동을 유발할 수 있으므로 * session *이라는 용어를 사용하지 않을 것입니다. 실제로 각 요청은 인스턴스 변수가 요청 지속 기간 동안 유효한 새 컨트롤러 인스턴스를 만듭니다. –

+0

나는 그것을 고려했지만 더 열심히 생각해야한다. 당신은 절대적으로 옳았습니다. 혼란을 없애기 위해 답변을 업데이트했습니다 (바라건대). – Alex