2016-01-21 78 views
1

我正在嘗試使用Jbuilder設置簡單的JSON響應。我的控制器如下:未找到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網址

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

'已完成404 Not Found'並不意味着沒有找到該視圖!如果Rails無法找到視圖,則會引發錯誤並返回500. 404意味着'Job.find(params [:id])'沒有找到記錄。檢查導軌日誌。 – max

+0

但它找到了工作,正如我所說的,如果我向控制器添加一個直接的JSON輸出'render json:@ job'我得到所需的JSON輸出。 – 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 

在Controller中作爲默認動作

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

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

     respond_to do |format| 
     format.json 
     end 
    end 

end