4

我有一個現有的網站,有一堆不同的模型和控制器。我目前正在將Twilio的服務整合到此網站中。 Twilio允許您提供一個網址,當用戶使用手機與您的電話號碼進行交互時將會調用該網址。不幸的是,只有一個你可以提供給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不會被髮送和接收的cookie你,所以你不會有經過認證的用戶一個很好的機會。如果是這種情況,最好將所有共享代碼放在模型中,並使用您的GroupsController和TwilioController的電話號碼身份驗證來處理cookie身份驗證。例如:

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