Шаблоны Rails4 Jbuilder не найдены

Я пытаюсь настроить простой ответ JSON с помощью Jbuilder. Мой контроллер выглядит следующим образом:

class Api::V1::JobsController < Api::V1::BaseController
   def show
      @job = Job.find(params[:id])
   end
end

У меня есть шаблон jbuilder здесь:

views\api\v1\jobs\show.json.jbuilder

Почему-то при загрузке страницы в браузере или Postman контроллер попадает, но шаблон jbuilder не найден. я получаю:

Rendered text template (0.5ms) Completed 404 Not Found in 298ms

Если я изменю действие show на контроллере заданий и добавлю render json: @job, я получу желаемый результат, но, конечно, он не использует шаблон jbuilder.

Не могу понять, почему он не видит шаблон jbuilder!

добавлены некоторые дополнительные детали, если я перейду к URL-адресу .json

Started GET "/api/v1/jobs/69407.json" for 127.0.0.1 at 2016-01-21 19:16:44 -0500
Processing by Api::V1::JobsController#show as JSON
  Parameters: {"id"=>"69407"}
  Job Load (18.3ms)  SELECT  "jobs".* FROM "jobs" WHERE "jobs"."id" = $1 LIMIT 1  [["id", 69407]]
  Rendered text template (0.5ms)
Completed 404 Not Found in 86ms (Views: 1.1ms | ActiveRecord: 56.4ms)

update - я обнаружил, что если я специально ссылаюсь на шаблон jbuilder, он загружается:

render 'show', formats: [:json], handlers: [:jbuilder], status: 200

Кроме того, чтобы даже заставить вышеперечисленное работать, мне пришлось добавить драгоценный камень jbuilder в мой файл драгоценного камня - что странно, поскольку я использую Rails 4, который должен включать его по умолчанию?


person cman77    schedule 21.01.2016    source источник
comment
Completed 404 Not Found не означает, что представление не найдено! Если Rails не сможет найти представление, он выдаст ошибку и вернет 500. 404 означает, что Job.find(params[:id]) не находит запись. Проверьте журнал рельсов.   -  person max    schedule 21.01.2016
comment
Но это поиск работы, как я уже сказал, если я добавлю прямой вывод JSON в контроллер render json: @job, я получу желаемый вывод JSON.   -  person cman77    schedule 21.01.2016
comment
Можете ли вы проверить доступ к \api\v1\jobs\1.json, а затем добавить вывод из журнала рельсов в вопрос? Дать квалифицированный ответ намного проще.   -  person max    schedule 21.01.2016
comment
@max добавил - спасибо!   -  person cman77    schedule 22.01.2016
comment
@ cman77 cman77 есть ли у вас response_to :json в вашем контроллере приложений или базовом контроллере? По умолчанию используется html, и я вижу отображаемый текстовый шаблон.   -  person Olalekan Sogunle    schedule 24.01.2016
comment
а что есть в маршрутах? format: 'json'? Проверьте также шаблон JBuilder никогда не вызывается   -  person Artem    schedule 24.01.2016
comment
@OlalekanSogunle duh - я думаю, что это было все. Пожалуйста, ответьте, и я назначу награду.   -  person cman77    schedule 24.01.2016


Ответы (2)


Я думаю, что вам, возможно, придется поместить respond_to :json в ваш контроллер приложения или базовый контроллер. По умолчанию используется html, и я вижу отображаемый текстовый шаблон.

person Olalekan Sogunle    schedule 24.01.2016
comment
примера было бы достаточно. - person Prime; 09.11.2020

Чтобы расширить ответ @OlalekanSogunle. Вы можете установить, как вы хотите, чтобы действие реагировало несколькими способами.

В маршрутах (по умолчанию фактические маршруты будут устанавливать формат запроса заголовка в формате json):

Rails.application.routes.draw do

    namespace :api do
        namespace :v1 do
            get 'jobs/show', to: 'jobs#show', defaults: { format: :json }, as: :job
        end
    end

end

В контроллере как класс по умолчанию:

class Api::V1::JobsController < Api::V1::BaseController

   respond_to :json

   def show
      @job = Job.find(params[:id])
   end

end

В Контроллере как действие по умолчанию:

class Api::V1::JobsController < Api::V1::BaseController

   def show
      @job = Job.find(params[:id])

      respond_to do |format|
         format.json
      end
   end

end
person blnc    schedule 24.01.2016