2016-01-21 1 views
1

Я пытаюсь настроить простой ответ JSON с помощью Jbuilder. Мой контроллер выглядит следующим образом:Rails4 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

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

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

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

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

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

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) 

обновление - я обнаружил, что если я конкретно ссылку на шаблон JBuilder он загружает:

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

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

+1

'Completed 404 Not Found' не означает, что вид не найден! Если Rails не может найти представление, оно вызовет ошибку и вернет 500. 404 означает, что 'Job.find (params [: id])' не находит запись. Проверьте журнал рельсов. – max

+0

Но он находит работу, как я уже сказал, добавляю ли прямой вывод JSON к контроллеру 'render json: @ job', я получаю желаемый JSON out put. – cman77

+0

Можете ли вы проверить доступ к '\ api \ v1 \ jobs \ 1.json', а затем добавить вывод из журнала rails в вопрос? Это дает намного легче дать квалифицированный ответ. – max

ответ

3

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

3

Чтобы расширить ответ на @ 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