Home > OS >  rendering json gets error no template found for controller rendering head no_content 204
rendering json gets error no template found for controller rendering head no_content 204

Time:04-21

I have a controller that render a json with data from models. When i enter route to get it it do nothing and just show and error in console.

Controller:


    class Api::ForecastController < ApplicationController
      before_action :set_hourly_forecast, only: %i[ show edit update destroy ]
    
    
      def index
        respond_to do |format|
            format.html do
              @hourly_forecasts = HourlyForecast.where(forecast_location_id: params[:forecast_location_id]).paginate(:page => params[:page], :per_page=>24) if params[:forecast_location_id].present?
            end
            format.json do
              weather_service = WeatherService.where(name: params[:name])
              @forecast_location = ForecastLocation.where(weather_service_id: weather_service)#& municipality: @municipality.name)
              @hourly_forecasts = HourlyForecast.where(forecast_location_id: forecast_location.id ).paginate(:page => params[:page], :per_page=>24) if params[:forecast_location_id].present?
            end
        end
      end
    
      private
        # Use callbacks to share common setup or constraints between actions.
        def set_hourly_forecast
          @hourly_forecast = HourlyForecast.find(params[:id])
        end
    
        # Only allow a list of trusted parameters through.
        def hourly_forecast_params
          params.require(:hourly_forecast).permit(:forecast_location_id, :date, :temperature, :humidity, :rain, :rain_probability, :wind_speed, :wind_direction)
        end
    end

Error:

> Started GET "/api/forecast.json?name=dark_sky" for 127.0.0.1 at 2022-04-20 18:33:29  0200
Processing by Api::ForecastController#index as JSON
  Parameters: {"name"=>"dark_sky"}
No template found for Api::ForecastController#index, rendering head :no_content
Completed 204 No Content in 53ms (ActiveRecord: 6.2ms | Allocations: 4983)

The route i use its

 127.0.0.1:3000/api/forecast.json?name=dark_sky

So the output should be a json with all hourly model. But it just do nothing and on console it does get and the select but jumps this error of template, i dont understand it since im new on rails.

If need more controllers, models or anything ask in comments.

CodePudding user response:

You have to have a separate template file to render json index.json.jbuilder for example.

# app/views/api/forecasts/index.json.jbuilder

json.array! @hourly_forecasts do |hourly_forecast|
  json.extract! hourly_forecast, :id, :forecast_location_id, :date, :temperature, :humidity, :rain, :rain_probability, :wind_speed, :wind_direction
  json.url api_forecast_url(hourly_forecast, format: :json)
end

https://github.com/rails/jbuilder

If you don't need to customize rendered json too much, render json inline in the controller

format.json do
  weather_service = WeatherService.where(name: params[:name])
  @forecast_location = ForecastLocation.where(weather_service_id: weather_service)#& municipality: @municipality.name)
  @hourly_forecasts = HourlyForecast.where(forecast_location_id: forecast_location.id ).paginate(:page => params[:page], :per_page=>24) if params[:forecast_location_id].present?

  render json: @hourly_forecasts
end

https://guides.rubyonrails.org/layouts_and_rendering.html#rendering-json

https://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html

  • Related