steventnorris
steventnorris

Reputation: 5896

Nested Routes Files Rails

I have crafted some nested routes files using the below in my config/initializers:

class ActionDispatch::Routing::Mapper
  def draw(routes_name, sub_path=nil)
    if sub_path.present?
      instance_eval(File.read(Rails.root.join("config/routes/#{sub_path}/#{routes_name}.rb")))
    else
      instance_eval(File.read(Rails.root.join("config/routes/#{routes_name}.rb")))
    end
  end
end

However, when used like this in the routes file:

Rails.application.routes.draw do
  scope :api do
    ["v1"].map { |version| draw :base, "api/" + version }
  end
end

The routes there do not appear nested as api/users etc. Not sure why the scope is getting ignored there.

EDIT: More Detailed Example

routes.rb

namespace :api, defaults: { format: :json } do
    Rails.application.routes.draw do
      ["v1"].map { |version| draw :base, "api/" + version }
    end
end

base.rb

  namespace :v1 do
      Rails.application.routes.draw do
        [:identity].map { |path| draw path, "api/v1"}
      end
  end

identity.rb

Rails.application.routes.draw do
      # Ensures proper namespace when fetching controllers, but does not add to path for routes
      scope module: :identity do

        namespace :users do
          put '/', action: :update
          patch '/', action: :update
          get 'user_from_token', action: :update
        end

      end
end

Upvotes: 1

Views: 253

Answers (1)

Stanislav Zaleski
Stanislav Zaleski

Reputation: 414

Rails.application.routes.draw was redundant

# config/routes.rb
Rails.application.routes.draw do
  scope :api do
    ["v1"].map { |version| draw :base, "api/" + version }
  end
end
# config/routes/api/v1/base.rb
namespace :v1 do
  # Rails.application.routes.draw do
    [:identity].map { |path| draw path, "api/v1"}
  # end
end
# config/routes/api/v1/identity.rb
# Rails.application.routes.draw do
  # Ensures proper namespace when fetching controllers, but does not add to path for routes
  scope module: :identity do

    namespace :users do
      put '/', action: :update
      patch '/', action: :update
      get 'user_from_token', action: :update
    end

  end
# end
$ rake routes
                   Prefix Verb  URI Pattern                                                                              Controller#Action
                 v1_users PUT   /api/v1/users(.:format)                                                                  v1/identity/users#update
                          PATCH /api/v1/users(.:format)                                                                  v1/identity/users#update
 v1_users_user_from_token GET   /api/v1/users/user_from_token(.:format)                                                  v1/identity/users#update
       rails_service_blob GET   /rails/active_storage/blobs/:signed_id/*filename(.:format)                               active_storage/blobs#show
rails_blob_representation GET   /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show
       rails_disk_service GET   /rails/active_storage/disk/:encoded_key/*filename(.:format)                              active_storage/disk#show
update_rails_disk_service PUT   /rails/active_storage/disk/:encoded_token(.:format)                                      active_storage/disk#update
     rails_direct_uploads POST  /rails/active_storage/direct_uploads(.:format)                                           active_storage/direct_uploads#create

Upvotes: 1

Related Questions