2015-03-29 3 views
0

У меня есть RESTful Rails 4.2.1 контроллера с маршрутами, как так:Приемки неиспользуемого метода HTTP ресурса

resources :users do 
    resources :labels, only: %w(index show update destroy) 
end 

Поскольку модель этого контроллера невероятно крошечная (только имя, идентификатор и которые вы бы не редактировали с помощью этого контроллера), я хотел бы поддержать массовое редактирование PUT ting или PATCH, используя маршрут /users/:user_id/labels. (PUT и PATCH не используются в коллекции и захватывают семантику, которую я пытаюсь реализовать, то есть редактирование всей коллекции.)

Проблема в том, что я не вижу, как я могу это сделать. Я могу сказать что-то вроде:

resources :users do 
    resources :labels, only: %w(index show update destroy) do 
    collection do 
     patch 'all', to: 'labels#update_many' 
    end 
    end 
end 

Но это привело бы к маршруту /users/:user_id/labels/all. Если оставить строку имени пустой или nil, кажется, терпит неудачу (rake routes не показывает никаких указаний на маршрут), и опускание полностью вызывает ошибку. В то же время, делая что-то вроде этого:

resources :users do 
    resources :labels, only: %w(index show update destroy) 
    member do 
    patch 'labels', to: 'labels#update_many' 
    end 
end 

Результаты в маршруте /users/:id/labels, что почти сразу же за исключением того, что идентификатор пользователя приходит как :id вместо :user_id, что делает его трудно обрабатывать выборки объекта пользователя.

Я полагаю, что я мог бы жестко кодировать весь маршрут в корневом уровне match, но это просто неправильно.

Есть ли какой-то трюк, о котором я не знаю, для этого?

+0

не уверен, что это работает: patch '/', to: 'labels # update_many' – srecnig

ответ

1

Попробуйте это:

resources :users do 
    resources :labels, only: %w(index show update destroy) 
    patch 'labels', to: 'labels#update_many' 
end 

Маршрут Результат:

PATCH  /users/:user_id/labels(.:format)   labels#update_many 
+0

Nice и clean. Мне это нравится. –

0

Этот маленький трюк работает:

resources :labels, only: %w(index update destroy) do 
    root to: 'labels#update_many', via: [:patch, :put], as: '' 
end 

Когда вы сделаете это, он хочет создать резервированной user_labels_root_path помощник; as: '' подавляет это.

Тем не менее, ответ Dabrorius выше, более чистый, поэтому я собираюсь использовать его вместо этого (измененный, чтобы соответствовать как PATCH, так и PUT).

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