2010-11-25 6 views

답변

2

예. 이것은 모델에서 세션 데이터를 사용하는 유일한 방법입니다. 나는 또한 그것을 사용했고 Apache + 승객과 관련된 배포 문제에 직면하지도 않았습니다.

하지만 세션 값으로 언제 재생하는지 확인해야합니다. 서버에 대한 각각의 새로운 요청에서 세션 값은 스레드에 저장되고 모델에서 액세스 할 수 있습니다. 스레드 값을 사용하여 논리를 적용하는 경우 스레드 값이 0이 아닌 상황에서도 확인하십시오.

개발시 문제가 발생하기 때문에 모든 코드가 정상적으로 작동하지만 서버를 시작하는 동안 처음에는 스레드 값이 0으로 간주되므로 문제가 발생했습니다.

+0

감사합니다. Nimsesh. 1. ActiveRecord Observer에서 모든 레코드에 대해 세션에서 값을 사용하여 필드를 업데이트합니다. 2. current_user (restful_authentication) 필드를 설정합니다. 모든 사용자가 로그인 할 때 설정되는 다른 값을 보유합니까? – Saim

+0

예. 여기를 다시 보시오 http : //www.zorched.net/2007/05/29/making-session-data-available-to-models-in-ruby-on-rails/ ... 그것은'before_filter : set_user '를 호출하면 스레드에 대한 각각의 새 요청에 대한 세션 값이 저장됩니다. 즉, 모든 사용자가 서로 다른 값을 가지고 있음을 의미합니다. 모든 사람의 요청이 다르므로 스레드가 다른 값으로 업데이트를 계속합니다. –

25

나는 인터넷에서 작동하는 코드를 찾지 못했기 때문에 약간의 연구를했고 자신의 글을 썼다. Rails 3.2.x와 다른 버전에서도 작동합니다. 당신의 ApplicationController

# Set a filter that is invoked on every request 
    before_filter :_set_current_session 

    protected 
    def _set_current_session 
    # Define an accessor. The session is always in the current controller 
    # instance in @_request.session. So we need a way to access this in 
    # our model 
    accessor = instance_variable_get(:@_request) 

    # This defines a method session in ActiveRecord::Base. If your model 
    # inherits from another Base Class (when using MongoMapper or similar), 
    # insert the class here. 
    ActiveRecord::Base.send(:define_method, "session", proc {accessor.session}) 
    end 

에서

삽입이 나는 모델에서 세션에 액세스하는 나쁜 코드로 이어질 수 있음을 알려하지 않습니다. Other posts may tell you, that you are stupid. Model.save 메소드를 구현하는 것과 같이 모델에서 세션에 액세스하는 유효한 이유가 있지만 현재 사용자 세션에 저장됩니다.

+0

좋은 기술입니다. 고맙습니다! – Saim

+0

그리고 Rspec을 사용하여 올바르게 테스트 할 수 있습니까? 지금이 모델을 사용하고있는 모든 테스트에서'정의되지 않은 지역 변수 또는 메소드 세션 '이 나온다고 –

+0

좋은 해결책 감사합니다. –

관련 문제