2013-07-04 9 views
6

Ho un controller con una serie di azioni:Come instradare i controller senza azioni CRUD?

class TestsController < ApplicationController 
    def find 
    end 

    def break 
    end 

    def turn 
    end 
end 

Quando aggiungo al mio file di routes.rb in questo modo:

resources :tests 

ed eseguire il compito rake routes compaiono i seguenti turni aggiuntivi:

tests GET /tests(.:format)   tests#index 
      POST /tests(.:format)   tests#create 
new_test GET /tests/new(.:format)  tests#new 
edit_test GET /tests/:id/edit(.:format) tests#edit 
    test GET /tests/:id(.:format)  tests#show 
      PUT /tests/:id(.:format)  tests#update 
      DELETE /tests/:id(.:format)  tests#destroy 

Ovviamente il mio controller non ha le azioni precedenti. Quindi, come faccio a dire a Rails di evitare di generare/prevedere questi percorsi?

+3

Se non si desidera generare le rotte quindi non aggiungere 'risorse: test' al tuo file di percorsi. – Mischa

+0

Sì, potrei farlo ma faccio la bacchetta per definire collezioni e membri. Quindi preferisco definire le risorse. – Roman

+0

Perché vuoi definire collezioni e membri? – Mischa

risposta

9

È possibile specificare le azioni che si desidera verso rotta in questo modo:

resources :tests, except: [:new, :create, :edit, :update, :destroy] do 
    collection do 
    get 'find' 
    get 'break' 
    get 'turn' 
    end 
end 
+0

Questo genera ancora percorsi per 'new',' create', 'edit',' update' ecc. Dovrebbe dare un'occhiata a [ percorsi non intraprendenti] (http://guides.rubyonrails.org/routing.html#non-resourceful-routes). – Mischa

+0

Si può evitare semplicemente usando le risorse ' : test, eccetto: [: nuovo,: crea,: modifica]' ecc. Se necessario (non è stato richiesto, quindi non l'ho incluso per cominciare). –

+0

Questa è una soluzione molto strana: genera tutti i percorsi pieni di risorse, eccetto tutti i percorsi pieni di risorse. – Mischa

1

Se non si desidera che i percorsi rilassanti, non utilizzare resources, specificare ogni percorso e l'azione su di essa la propria.

get '/tests/find' => 'tests#find' 
post '/tests/break' => 'tests#break' 
post '/tests/turn' => 'tests#turn' 

E si specifica params in questo modo:

post '/tests/add/:id' => 'tests#add' 
25

Basta aggiungere una risposta per il futuro, semplici modi di percorso senza CRUD:

resources :tests, only: [] do 
    collection do 
    get 'find' 
    match 'break' 
    match 'turn' 
    end 
end 

# output of rake routes 

find_tests GET /tests/find(.:format) tests#find 
break_tests  /tests/break(.:format) tests#break 
turn_tests  /tests/turn(.:format) tests#turn 

o utilizzare namespace invece di resources

namespace :tests do 
    get 'find' 
    match 'break' 
    match 'turn' 
end 

# output of rake routes 

tests_find GET /tests/find(.:format) tests#find 
tests_break  /tests/break(.:format) tests#break 
tests_turn  /tests/turn(.:format) tests#turn 

per rotaie 4. (causa match method has been deprecated in rotaie 4.x o più recente)

resources :tests, only: [] do 
    collection do 
    get 'find' 
    get 'break' 
    get 'turn' 
    end 
end 

uso namespace

namespace :tests do 
    get 'find' 
    get 'break' 
    get 'turn' 
end 
+0

lo spazio dei nomi sembra essere la risposta giusta per me. – rubyprince

Problemi correlati