2013-06-14 4 views
0

URI의 매개 변수를 기반으로 체인의 범위를 동적으로 변경하는 방법은 무엇입니까?매개 변수를 기반으로 범위를 변경하십시오.

http://www.example.com/object?status=approved

ObjectController#index으로 이어질 것입니다 : 예를 들어

@objects = Object.pending.<other-chains>

:

def index 
    @objects = Object.approved.<other-chains> 
end 

status 경우 pending이었다 컨트롤러 방법은 다음과 같을 것 0

+0

'/ objects/approved'과'/ objects/pending'을 고려해 볼 수 있습니다. Rails-y – meagar

답변

2

당신은하지 않을 것입니다. 두 범위 (pendingapproved)를 정의하고 URL을 기반으로 조건부로 호출합니다. 런타임에는 범위를 동적으로 변경할 수 없으며, 은 후속 요청을 몹시하게 중단합니다.

당신이 분기 피하려면/경우를 elses, 당신이 할 수있는 모델 단지 send 방법, 허용 방법의 사전 승인 된 목록에서이 있는지 확인 한 후에 :에 디폴트에 의해

class MyController 

    def index 
    @objects = Object.send(scope).chain.chain.chain 
    end 

protected 

    # return "pending", "approved", or "scoped", 
    # so that Object.send(scope) *always* works, and returns a chainable relation 
    def scope 
    scopes = %w(pending approved) 
    scopes.include?(params[:status].to_s) ? params[:status] : "scoped" 
    end 

end 

"scoped"을 사용하면 호출 된 메서드가 추가 메서드를 체인으로 연결할 수있는 관계를 반환하도록합니다.

0

방법 :

@objects = Object.send(params[:status]) 
+0

다른 범위로 묶을 수 있습니까? – CDub

+0

수 있어야합니다. 작동하는지 알려주세요. – Rebitzele

+0

params [: status]가 ActiveRecord :: Relation (즉, 객체의 범위이기도합니다)을 반환하는 한 연결될 수 있습니다. 하지만 이것은 매우 위험합니다. 컨트롤러에 "destroy_all"을 전달하면 어떨까요? 상태 매개 변수를 먼저 필터링하여 그것이 무엇인지 생각해야합니다. –

관련 문제