[Feature request][ActionPack::ActionDispatch::Routing] Add parameter for resources to alias "only: []" in routes.rb

I would like to propose a feature that would be kind of an alias for

resources :users, only: [] do



I thinks it’s weird to have to specify an empty array when we need a resourceful route without the default CRUD generated along.

It would allow us to use it like the shallow feature:

resources :users, without_crud: true do
get :unsubscribe, on: :collection
get :foo
post :bar


And generate only:

GET /users/unsubscribe
GET /users/:id/foo
POST /users/:id/bar


Any feedback would be greatly appreciated, thank you guys!

I feel that only: [] definitely is not an intuitive approach that shows what you would be trying to achieve in that instance.

Also, I believe your only current alternative would be writing out your resourcing ‘longhand’ outside of an actual resources block in your routes.rb, correct? (I have seen all too many apps bloat with a lot of handscrawled routes)

But since this is a bit aways from normal resources namespace usage maybe your alias ought to go all the way up to resources itself… such as:

resources_without_crud :users do



When I think of resources I think of the crud rails magic, and maybe it would help to make that even more explicit. Very interesting thought and thank you for raising it.

You can achieve this functionality by throwing this into the top of your routes drawing block:

def subresources(name, &block)

resources(name, only: [], &block)


since that block is getting instance_eval’d anyway, this will just put that method onto the routes object. Then you can:

subresources :users do



and it’ll have the same effect.

If you don’t want the resources anyway, why not just use namespace:

==> config/routes.rb <==

Rails.application.routes.draw do

namespace ‘users’ do

get ‘unsubscribe’

get ‘:id/foo’, action: :foo, as: :foo

post ‘:id/bar’, action: :bar, as: :bar



Prefix Verb URI Pattern Controller#Action

users_unsubscribe GET /users/unsubscribe(.:format) users#unsubscribe

users_foo GET /users/:id/foo(.:format) users#foo

users_bar POST /users/:id/bar(.:format) users#bar


Namespace is semantically different in that sub resources are nestled under an instance of the resource they represent, not just a static string.

i.e., /resource/1/subresource, not /resource/subresource