4

다른 모델과 컨트롤러가있는 기존 사이트가 있습니다. 현재 Twilio의 서비스를이 사이트에 통합하고 있습니다. Twilio를 사용하면 사용자가 전화를 사용하여 전화 번호와 상호 작용할 때 호출 할 URL을 제공 할 수 있습니다. 불행히도 Twilio에 제공 할 수있는 URL은 하나뿐입니다. 그러면 모든 구문 분석이 끝납니다.RoR : 다형성 컨트롤러

이제 사용자의 데이터를 분석하고 수행하려는 작업을 결정하는 twilio 컨트롤러가 있습니다.

사용자가 휴대 전화를 통해 할 수있는 모든 작업은 이미 웹 사이트에서 수행 할 수 있지만 이제는 이동 중에도 휴대 전화를 사용할 수 있습니다. 텍스트에 "내 그룹 foo"라는 텍스트가 있으면 그룹은 그에 따라 그룹을 만들려고 시도합니다. 내 문제는 이미 그룹을 만드는 방법을 알고있는 그룹 컨트롤러가 있고 적절한 before_filters를 사용하여 사용자가 다른 작업을 할 권한이 있는지 확인하는 것입니다.

twilio 컨트롤러가 요청을 구문 분석 한 다음이를 어떤 방식으로 적절한 컨트롤러로 "전달"할 수 있습니까? 차라리 twilio 컨트롤러에 다른 모든 컨트롤러에있는 코드와 필터를 모두 복제하지 말고 그 중 일부는 모델에 넣을 권리가 없다고 느낍니다.

나는 일반적으로 레일에 약간 새로운 편이어서 어떤 제안이라도 열어두고 있습니다. 내 유스 케이스에 맞는 디자인 패턴이 있기를 바라고 있으며 올바른 솔루션을 찾기 위해 전체 프로젝트를 리팩터링하려고합니다.

답변

4

나는 당신이 할 수있는 몇 가지가 있다고 생각합니다. 특정 형식으로 응답 할 필요가없는 경우 적절하게 형식이 지정된 매개 변수로 요청을 리디렉션 할 수 있습니다. 예를 들면 :

class TwilioController 
    def create 
    if params[:twilio_action] == 'create group' 
     redirect_to create_group_path(:id => params[:group_id], :number => params[:number]) 
    end 
    end 
end 

twilio API를 보내고 당신을 위해 쿠키를 수신 할 수 없기 때문에 인증 된 사용자가 없습니다 있도록,하지만 인증에 문제가있는 것입니다 좋은 기회가있다. 이 경우 모든 공유 코드를 모델에 넣고 GroupsController로 쿠키 인증을 처리하고 TwilioController로 전화 번호 인증을 처리하는 것이 가장 좋습니다. 예를 들어 :

class TwilioController 
    def create 
    if params[:twilio_action] == 'create group' 
     if can_create_group?(params[:phone_number]) 
     Group.create(:id => params[:group_id]) 
     end 
    end 
    end 
end 

이 모델에서 비즈니스 로직을 넣어하는 것이 좋습니다,하지만 당신은 실제로 당신이 두 개의 컨트롤러 내에서 공유하고 싶은 기능이있는 경우 당신은 항상뿐만 아니라 그렇게 할 수있는 모듈을 만들 수 있습니다

module GroupControllerActions 
    def create_group user 
    Group.create(params[:group].merge({:user => user})) 
    end 
end 

class TwilioController 
    include GroupControllerActions 

    def create 
    if params[:twilio_action] == 'create group' 
     create_group(User.find_by_number(params[:phone_number])) 
    end 
    end 
end 

class GroupsController 
    def create 
    create_group(current_user) 
    end 
end