Search code examples
ruby-on-railsruby-on-rails-4model-view-controllerroutesnested-resources

Rails 4: can I deep nest a shallow resource within another shallow resource?


In my Rails 4 app, there are five models:

class User < ActiveRecord::Base
  has_many :administrations
  has_many :calendars, through: :administrations
end

class Calendar < ActiveRecord::Base
  has_many :administrations
  has_many :users, through: :administrations
  has_many :posts
end

class Administration < ActiveRecord::Base
  belongs_to :user
  belongs_to :calendar
end

class Post < ActiveRecord::Base
  belongs_to :calendar
end

class Comment < ActiveRecord::Base
  belongs_to :post
  belongs_to :user
end

Currently, I structured my resources as follows:

Rails.application.routes.draw do

  root to: 'pages#home'

  devise_for :users, :path => 'account'

  resources :calendars do
    resources :posts, shallow: true
  end

end

Now, I need to add the comments resource to the route file and I am considering nesting it with shallow: true within the posts resource, which is already a shallow resource, as follows:

Rails.application.routes.draw do

  root to: 'pages#home'

  devise_for :users, :path => 'account'

  resources :calendars do
    resources :posts, shallow: true do
      resources :comments, shallow: true
    end
  end

end

I believe this is technically possible, but I am not sure this would be considered a good or bad practice.

Especially since, from what I understand in the Rails Guides, shallow nesting's main purpose is to avoid deep nesting.

In other words, are there technical reasons I may be overseeing as a Rails beginner that would make this a bad practice and cause significant problems in the future regarding the development of the app?


Solution

  • Yes, your nested shallow routing will work fine. Also, as deeply-nested resources quickly become cumbersome, hence comes the use of shallow routing. So, I think it is fine if you as an application developer is okay with that.

    Jamis Buck proposes a rule of thumb for good Rails design:

    Resources should never be nested more than 1 level deep.

    So, I don't think you are overseeing anything here. You can use those shallow routes if those work for you.