I\'d like a Rails controller (all of them, actually, it\'s an API) to render JSON always always.
I don\'t want Rails to return \"route not found\", or try and fail t
You can add a before_filter
in your controller to set the request format to json
:
# app/controllers/foos_controller.rb
before_action :set_default_response_format
protected
def set_default_response_format
request.format = :json
end
This will set all response format to json
. If you want to allow other formats, you could check for the presence of format
parameter when setting request.format
, for e.g:
def set_default_response_format
request.format = :json unless params[:format]
end
I tried the above solutions and it didn't solve my use case.
In some of the controllers of my Rails 4.2 app, there was no explicit render
called. For example, a service object was called and nothing was returned. Since they are json api controllers, rails was complaining with a missing template error. To resolve I added this to our base controller.
def render(*args)
options = args.first
options.present? ? super : super(json: {}, status: :ok)
end
It's a large app I'm converting to Rails 5, so this is just a safety measure as I removed the RocketPants
gem that seemed to do this automatically.
As a note, my controllers inherit from ActionController::Base
Of course:
before_filter :always_json
protected
def always_json
params[:format] = "json"
end
You should probably put this in a root controller for your API.
It's just:
render formats: :json
You can use format.any
:
def action
respond_to do |format|
format.any { render json: your_json, content_type: 'application/json' }
end
end
I had similar issue but with '.js' extension. To solve I did the following in the view:
<%= params.except!(:format) %>
<%= will_paginate @posts %>