2013-07-04 2 views
6

У меня есть контроллер с рядом действий:Как управлять контроллерами без CRUD-действий?

class TestsController < ApplicationController 
    def find 
    end 

    def break 
    end 

    def turn 
    end 
end 

Когда я добавить его в мой routes.rb файл как так:

resources :tests 

и выполнить rake routes задачу я вижу следующие дополнительные раунды:

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 

Очевидно, что у моего контроллера нет вышеуказанных действий. Итак, как я могу сказать Rails, чтобы избежать генерации/ожидания этих маршрутов?

+3

Если вы не хотите, чтобы генерировать эти маршруты не вносите 'ресурсы: test' в ваш файл маршрутов. – Mischa

+0

Да, я могу это сделать, но я делаю палочку для определения коллекций и членов. Поэтому я предпочитаю определять ресурсы. – Roman

+0

Почему вы хотите определить коллекции и члены? – Mischa

ответ

9

Вы можете указать действия, которые вы хотите, чтобы маршрут, как это:

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

Это все еще генерирует маршруты для 'new',' create', 'edit',' update' и т. Д. Он должен посмотреть [ ненаучные маршруты] (http://guides.rubyonrails.org/routing.html#non-resourceful-routes). – Mischa

+0

Этого можно избежать просто с помощью тестов 'resources: tests, за исключением: [: new,: create,: edit]' и т. Д., Если необходимо (не было задано, поэтому я не включил его для начала). –

+0

Это очень странное решение: генерировать все находчивые маршруты, кроме всех находчивых маршрутов. – Mischa

1

Если вы не хотите, успокоительные маршрутов, не используйте resources, указать каждый путь и действия по его собственному.

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

И вы задаете Params так:

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

Просто добавьте ответ на будущее, простые способы маршрута без 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 

или использовать namespace вместо 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 

для Rails 4. (причина match method has been deprecated в рельсах 4.x или последний)

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

использования namespace

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

пространство имен кажется правильным ответом на меня. – rubyprince

Смежные вопросы