【问题标题】:Rails 406 for .js.erb.js.erb 的 Rails 406
【发布时间】:2013-06-08 00:59:35
【问题描述】:

我知道这个问题被问了很多,但我查看了所有简单的解决方案,但它们都不起作用。

首先,.js.erb 响应适用于我所有其他控制器...我生成了一个新控制器,但它不会响应 .js.erb

  def report
    @report = Report.all
    respond_to do |format|
      format.js do
        render :content_type => 'text/javascript'
      end
    end
  end

这条路线确实有效,并将呈现 html。我不知道为什么 .js.erb 会适用于我的其他控制器而不适用于新控制器。在制作这个新的之前我已经做了很多摆弄......所以调试对我来说很难。

【问题讨论】:

  • 如何摆脱:content_type 键?
  • @CodyCaughlan,试过了。尝试了多种格式。

标签: ruby-on-rails http-status-code-406


【解决方案1】:

删除整个 respond_to 块。 Rails 会选择正确的视图:

def report
  @report = Report.all
end

【讨论】:

  • 它会选择 html 而不是 js。
  • 即使我的构造函数只有respond_to :js
  • 如果我想先渲染 html 再渲染 .js 就不行了,对吧? Rails 只会渲染一个或另一个?我想渲染 html 然后从 .js 初始化一些 jquery 的东西。这是不好的做法吗?
  • @KevinBrown 如果选择 HTML 模板,那是因为您没有使用正确的内容类型发出请求。您确实不需要需要respond_to 块来在渲染.js.erb 文件和.html.erb 文件之间进行选择。 Rails 会自动执行这些操作,如果您的请求正确。
  • 对不起,我没有解释清楚。我想先渲染 html 和 js.erb。 .js.erb 需要有一些 jquery 来初始化页面上的东西,所以没有 ajax 回调到控制器。我正在尝试在我的 .haml 中使用 :javascript,但 jquery 尚未初始化,因此也无法正常工作。奇怪的是,到目前为止,这一切都在我的其他控制器中起作用。我尝试将 .js.erb 渲染为 .haml 中的一个部分,但它输出为 html...
【解决方案2】:

如果您收到 406

您需要明确禁用 erb 的布局模板检查。

render layout: false

如果您需要它们来支持其他格式,您可以保留 respond_to 和 format。

(注意:出于内容安全策略目的的动态 js?)

【讨论】:

  • 错误406不仅会在MissingExactTemplate的情况下出现,UnknownFormat也会出现,我认为这个问题是关于UnknownFormat的情况,所以layout: false可能无济于事。
猜你喜欢
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2021-10-24
  • 2016-12-30
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多