2010-09-26 16 views
5

Sto cercando di implementare un sistema "contest" simile a quello utilizzato da GitHub. Ad esempio, è possibile creare una pubblicazione appartenente all'Utente oa una delle Società a cui l'Utente appartiene a seconda che l'Utente si trovi nel contesto "Utente" o in un contesto che fa riferimento a una delle Società.Rails 3 routing basato sul contesto

Come parte di questo, mi piacerebbe poter eseguire il routing in base al contesto corrente dell'utente. Ad esempio, se l'utente si trova nel proprio contesto, /dashboard deve essere instradato a users/show, ma se si trovano nel contesto di Società con ID 35, quindi /dashboard deve instradare a companies/35/dashboard.

potevo percorso /dashboard a un controller specifico incaricato di prendere tali decisioni, come ad esempio context#dashboard che potrebbe poi fare un redirect_to, ma questo non si sentono abbastanza a destra (forse perché ci stiamo prendendo la logica che le guide di routing modulo dovrebbe essere responsabile e spostarlo su un controller?)

Quale sarebbe il modo corretto per risolvere questo problema in Rails 3?

+0

Capisco che non si sente a destra con il controller del cruscotto come opzione router pseudo, ma avere il router lettura di un modello di contesto/sessione da informazioni passò biscotti/params sembra troppo strano. – hellvinz

risposta

2

Ho finalmente trovato una soluzione al mio problema che mi piace. Questo utilizzerà gli URL dalla mia domanda originale.

Innanzitutto, si supponga che un oggetto memorizzato nella sessione Context memorizzi se l'utente si trova in un contesto "utente" o in un contesto "azienda". Se l'utente si trova in un contesto di "società", allora l'ID dell'azienda che sta lavorando è nell'oggetto. Possiamo ottenere il contesto tramite un helper chiamato get_context e possiamo ottenere l'utente attualmente connesso tramite current_user.

Ora, abbiamo creato le nostre rotte in modo da:

config/routes.rb:

MyApplication::Application.routes.draw do 
    get "dashboard" => "redirect", :user => "https://stackoverflow.com/users/show", :company => "/companies/:id/dashboard" 
end 

Ora, app/controllers/redirect_controller.rb:

class RedirectController < ApplicationController 
    def method_missing(method, *args) 
    user_url = params[:user] 
    company_url = params[:company] 
    context  = get_context 

    case context.type 
    when :user 
     redirect_to user_url.gsub(":id", current_user.id.to_s) 
    when :company 
     redirect_to company_url.gsub(":id", context.id.to_s) 
    end 
    end 
end 

E 'abbastanza facile mantenere gli URL effettivi per il reindirizzamento in cui appartengono (nel file routes.rb!) e tali dati vengono passati a un controller DRY. Posso anche passare l'ID dell'oggetto contesto corrente nella rotta.

0

Il tuo approccio sembra il modo migliore per me. Qualsiasi altra cosa sarebbe più disordinata e non molto standard.

+0

Sembra che questo dovrebbe essere un commento. –