【问题标题】:Rails4 Jbuilder templates not being found未找到 Rails4 Jbuilder 模板
【发布时间】:2016-01-21 02:40:47
【问题描述】:

我正在尝试使用 Jbuilder 设置一个简单的 JSON 响应。我的控制器如下:

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

如果我修改作业控制器上的显示操作并添加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 上应该默认包含它?

【问题讨论】:

  • Completed 404 Not Found 并不表示没有找到该视图!如果 Rails 找不到视图,它将引发错误并返回 500。404 表示Job.find(params[:id]) 没有找到记录。检查 rails 日志。
  • 但它正在找到工作,正如我所说,如果我将直接 JSON 输出添加到控制器 render json: @job,我会得到所需的 JSON 输出。
  • 您能否测试访问\api\v1\jobs\1.json,然后将rails 日志的输出添加到问题中?这样可以更轻松地给出合格的答案。
  • @cman77 你的应用程序控制器或基本控制器中有 response_to :json 吗?默认是 html,我看到一个渲染的文本模板。
  • @OlalekanSogunle duh - 我想就是这样。请回答,我将奖励赏金。

标签: ruby-on-rails jbuilder


【解决方案1】:

扩展@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

在Controller中作为类默认

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

【讨论】:

    【解决方案2】:

    我认为您可能必须在应用程序控制器或基本控制器中添加respond_to :json。默认是 html,我看到一个渲染的文本模板。

    【讨论】:

    • 一个例子就足够了。
    猜你喜欢
    • 1970-01-01
    • 2014-07-16
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 2017-12-24
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多