2011-03-29 4 views
2

Rails Warden 플러그인을 사용하고 있습니다. 현재 사용자를 돌려주는 helper method '사용자'를 정의합니다. 소스 코드 링크를 참조하십시오.Rails3의 비즈니스 로직에서 현재 사용자를 보호하는 방법

이제 컨트롤러에 대한 참조가없는 비즈니스 논리 개체가 있습니다. 하지만 현재 사용자를 얻고 싶습니다. 이 방법에 접근 할 수있는 방법이 있습니까?

나는

ActionController::Base.helpers.user 

또는 행운 심지어

RailsWarden::Mixins::HelperMethods.user 

을 시도했습니다. 감사.

+0

모델로부터 액세스를 시도하고 있습니까? – fl00r

+0

아니요, 정적 메서드 만있는 개체에서입니다. 이들은 컨트롤러에서 호출됩니다. – lzap

+0

'Rack :: Test :: Methods'를 포함 시켰습니까? https://github.com/hassox/rails_warden/wiki/ 문제 해결 –

답변

2

이제 컨트롤러에 대한 참조가없는 비즈니스 비즈니스 개체가 있습니다. 그러나 나는 현재 사용자를 얻고 싶습니다. 이 방법을 사용하는 방법이 있습니까? ?

그런데 왜 현재 사용자를 그 방법으로 전달할 수 없습니까?

또한 당신은 그들을 혼합 할 수 있습니다.

을 난 강력하게 당신이 정적 헬퍼를 작성하는 억제 (그것이 루비, 자바하지 않습니다!).

... 등등

# user model 
class User 
    include SuperLogic 
    #it will get the `calculate_stuff` method 
end 

# controller 
include SuperLogic 
# so you can use it as one of 
calculate_stuff user 
calculate_stuff 

추가적으로 어디 액세스 권한을 : 당신이 그것을 필요로하는 곳에

module SuperLogic 
def calculate_stuff(current_user=nil) 
    (current_user || user || self).bills.sum 
end 
edn 

다음이 포함됩니다 : 당신은 그 도우미를 필요로 대신 는 모듈로 포함 비즈니스 논리를 사용하면 "정적"메서드 대신 클래스의 인스턴스를 만들 수 있습니다 (루비에서는 "클래스"메서드).

# controller 
def calculate 
    @result = BusinessLogic.new(user).calculate_stuff 
end 

이것은 아마도 당신이 할 수있는 가장 쉬운 방법 일 것입니다.

정말, 비즈니스 개체의 전체 HTTP 컨텍스트에 액세스 할 필요가 없습니다. (테스트하는 것에 대해서도 말하지 않고 있습니다.)

+0

감사합니다. 나는 이것을 사용했다 : http://github.com/bokmann/sentient_user http://github.com/astrails/let_my_controller_go http : // rails-bestpractices.co.kr/posts/47-fetch-current-in-models – lzap

0

비즈니스 로직을 생각할 때, 그것은 컨트롤러와 모델 사이에있는 것입니다. 나는 논리 메소드에 요청의 인스턴스를 전달하는 것이 좋을 것이라고 생각하고, 관리자 (warden)를 사용하고 있으므로 request.env [ 'warden']. user '에서 사용자를 얻을 수 있습니다.

논리 메소드가 모듈의 정적 (자체.) 메소드가되지 않는 좋은 이유가 있습니다. 어쩌면 Dmytrii의 제안이 효과가 있을지 모르겠지만 일회용 논리 비트를 동적으로 포함하는 것보다 '요구'하는 편이 더 좋습니다.

관련 문제