Search code examples
ruby-on-railsrubyurl-routingsingle-page-application

How to render file in Rails 5 API?


I have a single-page application written in React with Ruby on Rails back-end (API mode). Rails is also serving static files. I'm pointing Rails router to public/index.html, so my SPA could manage his own routing with react-router. This is common practice in order to make direct links and refresh to work.

routes.rb

match '*all', to: 'application#index', via: [:get]

application_controller.rb

class ApplicationController < ActionController::API
  def index
    render file: 'public/index.html'
  end
end

The problem is this doesn't work in API mode. It's just an empty response. If I change the parent class to ActionController::Base everything works as expected. But I don't want to inherit the bloat of full class, I need slim API version.

I've tried adding modules like ActionController::Renderers::All and AbstractController::Rendering without success.


Solution

  • If I change the parent class to ActionController::Base everything works as expected. But I don't want to inherit the bloat of full class, I need slim API version.

    Yes, if you serve index from ApplicationController, changing its base class would affect all other controllers. This is not good. But what if you had a specialized controller to serve this page?

    class StaticPagesController < ActionController::Base
      def index
        render file: 'public/index.html'
      end
    end
    

    This way, you have only one "bloated" controller and the others remain slim and fast.