2012-01-15 1 views
9

sto lavorando su un blog come l'applicazione, mio modulo dell'utente Posts has_many ei posti modulo belongs_to utenterotaie per misti nidificati e non nidificati risorse

voglio accedere sia utenti /: id/messaggi e post/

routes.rb è qualcosa di simile:

resources :users do 
    resources :posts 
end 

resources:posts 

come faccio a sapere all'interno del controller messaggi se accedere direttamente (/ messaggi) o attraverso il percorso nidificato (/ Users /: id/post)?

per esempio, quello che dovrebbe essere il metodo index del controller posti per fare l'azione indice corretto per/utenti /: id/messaggi e per il/i messaggi

c'è un modo migliore per fare questo?

risposta

7

Una soluzione potrebbe essere quella di utilizzare un filtro di prima sul controller, come:

before_filter :load_user 

def load_user 
    @user = User.find(params[:user_id]) if params[:user_id] 
    @posts = @user ? @user.posts : Post.scoped 
end 

Poi si deve riscrivere il controller un po 'per funzionare correttamente.

No refactoring necessario su index azione, @posts già caricato correttamente, ma si può fare un ulteriore filtraggio che vuoi

def index 
    @posts = @posts.where('updated_at < ?' Time.now) 
end 

quindi aggiornare ogni azione membro: nuova, creare, visualizzare, modificare, aggiornare, distruggere e utilizzare i post come base:

def new 
    @post = @posts.build 
end 

def create 
    @post = @posts.build(params[:task]) 
end 

def show 
    @post = @posts.find(params[:id]) 
end 

def edit 
    @post = @posts.find(params[:id]) 
end 

def update 
    @post = @posts.find(params[:id]) 
end 

def destroy 
    @post = @posts.find(params[:id]) 
end 

Naturalmente è possibile aggiungere altri filtri prima di rimuovere il codice duplicato.

1

Controllare i parametri.

Se solo post ti basta avere :id

Se l'utente/post avrete utente e l'ID per il post.

in modo da verificare se params[:user] ...

N.B. Se non l'utente, prova params[:user_id]

Per quanto riguarda il metodo index per posts penso che in effetti sarà lo SAME in entrambi i casi. Ciò che cambierà le cose è il suo utilizzo, associazione e scoping all'interno dell'utente.