이상적으로 컨트롤러에 액세스 할 수있는 데이터는 모델 메서드에 매개 변수로 전달되어야합니다. 따라서 코드를 다시 작성하는 것이 가능한지 확인하는 것이 좋습니다. 그러나 여기에 문제에 대한 두 가지 가능한 솔루션이 있습니다. 나는 일반적인 방식대로 나중에 접근하는 것을 선호한다.
접근 1 : 선언 컨트롤러 코드에서 가상 속성
class CardSignup
attr_accessor call_context
def call_context
@call_context || {}
end
end
: 당신의 CardSignup 모델에서
def create
cs = CardSignup.new(...)
cs.call_context = params
if cs.save
# success
else
# error
end
end
:
def credit_status_on_create
Organization.find(self.organization_id).update_credits(call_context)
end
업데이트 조직 모델. 카운트 로직이 변경되었음을 확인하십시오.
def update_credits
@organization = Organization.find(call_context[:id])
credit_count = @organization.card_signups.count(:conditions =>
{:credit_status => true})
end
접근법 2 : 선언 스레드 지역 변수 모든 모델
액세스 컨트롤러 코드 :
def create
Thread.local[:call_context] = params
cs = CardSignup.new(...)
if cs.save
# success
else
# error
end
end
업데이트 Organization
모델. 카운트 로직이 변경되었음을 확인하십시오.
def update_credits
@organization = Organization.find((Thread.local[:call_context] ||{})[:id])
credit_count = @organization.card_signups.count(:conditions =>
{:credit_status => true})
end
이것은 스레드로부터 안전한 솔루션이 아닙니다. –
JRuby를 사용하지 않는 한, 실제로는 다중 스레드되지 않습니다. –