2016-01-21 52 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