【问题标题】:rails view not defaulting to jsonrails 视图不默认为 json
【发布时间】:2015-03-18 17:07:17
【问题描述】:

我有一个带有showindex 方法的简单控制器。 routes.rb 有一个 resources :foo 条目,当我转到 localhost:3000/foo 时,我得到一个 missing template 错误,即使我在正确的文件夹中有一个 index.json.jbuilder 文件,当我转到 /foo.json 时很容易显示该文件

难道rails不应该看到这个特定视图没有html模板并自动使用json模板吗?

我正在使用 Rails 4.2。

【问题讨论】:

  • Rails 不会这样看。您必须明确指定格式。该文件将呈现到的所有格式。默认情况下,由于文件扩展名,文件index.json.jbuilder 将仅针对 json 请求调用呈现。否则 rails 会抛出模板错误。
  • 如果你想为所有格式呈现相同的文件,你可以像 render 'index.json.jbuilder', :formats => [:html, :xml, :js, :json] 那样做。

标签: ruby-on-rails json ruby-on-rails-4


【解决方案1】:

转到localhost:300/foo 将默认使用:html 格式。由于您没有相应的 html 视图,您将收到 missing template 错误。如果您希望路由默认为:json,您可以在定义路由时指定它

resources :foo, defaults: {format: :json}

【讨论】:

    【解决方案2】:

    来自官方documentation

    消息的下一部分包含一个哈希。此散列中的 :locale 键仅指示应检索的口语模板。默认情况下,这是英文 - 或“en” - 模板。 下一个键 :formats 指定响应的模板格式。默认格式是 :html,因此 Rails 正在寻找 HTML 模板。 最后一个键 :handlers 告诉我们可以使用哪些模板处理程序来呈现我们的模板。 :erb 最常用于 HTML 模板,:builder 用于 XML 模板,:coffee 使用 CoffeeScript 构建 JavaScript 模板。

    这就是 Rails 找不到您的 .json.jbuilder 视图的原因。因此,在您的情况下,您可以传递正确的 Accept HTTP 标头或覆盖请求格式:

    before_filter :default_request_format
    
    def default_request_format
      request.format = :json
    end
    

    或如上面@Bart Jedrocha 所述在路由中指定它。

    【讨论】:

      猜你喜欢
      • 2014-01-10
      • 2023-03-23
      • 1970-01-01
      • 2016-09-08
      • 2015-10-28
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多