Rails 中的 respond_to 出现未知格式错误。正确尝试实施轮询更新

Posted

技术标签:

【中文标题】Rails 中的 respond_to 出现未知格式错误。正确尝试实施轮询更新【英文标题】:Unknown Format error with respond_to in Rails. Correctly trying to implementing polling-to-update 【发布时间】:2015-11-04 11:20:35 【问题描述】:

嗨,我完全被困在这个问题上并寻求帮助。

当我对我的对象simulation 进行展示时,我希望一些 javascript 开始每十秒轮询一次,以异步调用 simulation#update

我想通过respond_to来做这件事,比如:

def show
    @simulation = Simulation.find(params[:id])
    respond_to do |format|
        format.js
        format.html  redirect_to simulation_url  # This causes problems
    end
end

所以我会有一个 update.js.erb 来做一些类似(对不起咖啡脚本)的事情

$.ajax(
    type: "PUT",
    url: "/simulations/#params"
) 

$('#sim_div').html("<%= j (render @simulation) %>");

setTimeout(callUpdate, 10000)
return

如果我包含format.html,我无法调用此javascript 部分,javascript 不会运行并且我收到格式错误,如果我确实包含该行,那么我会收到未知格式错误。

解决这个问题的正确方法是什么?我已经尝试了在资产管道中使用咖啡脚本的大量解决方案,以及奇怪的包含和内联 javascript。

为了清楚起见,我的观点是:

<%= render 'simulation' %>

<%= link_to 'Back', simulations_path %>

脚本和视图加载的部分是:

<div id="sim_div">
  <h1><%= @simulation.identifier %></h1>
  <h4 class="offset-col-sm-1">Dimensions: <%= @simulation.x_size %>x<%= @simulation.y_size %></h4>
  <h4 class="offset-col-sm-1">Verdict: <%= @simulation.verdict %></h4>

  <table class="table table-bordered">
    <thead>
      <tr>
      </tr>
    </thead>

    <tbody>
      <% @simulation.state.each do |row| %>
        <tr>
        <% row.each do |current| %>        
            <td class="text-center"><%= current %></td>        
          <% end%>
        </tr>
      <% end %>
    </tbody>
  </table>
  <br>
</div>

【问题讨论】:

【参考方案1】:

您可以尝试使用respond_to :html, :js 之类的快捷方式,看看是否可以清除它。否则尝试更明确的方法:

def show
  @simulation = Simulation.find(params[:id])
  respond_to do |format|
    format.js  render: "some view"
    format.html  redirect_to simulation_url 
  end
end

:show 动作中的format.js 在使用 ajax 调用 show 时默认呈现 show.js.erb。 html 响应将是一个重定向。

This 博文可能会有所帮助。

【讨论】:

对不起,这就是我正在做的事情。我在show.js.erb 中有该代码,因此该格式应该同时调用show.html.erbshow.js.erb 但是只有当我调用时才会调用html使用上面simulation#show中显示的respond_to 所以我明白你的意思,而不是渲染视图,只是渲染一个包含你的代码并渲染 html 部分的 JS 部分,但是每当我去“显示”一个模拟时,我都会得到一个请求html,而不是js,所以我从不执行那个js,我该如何解决这个问题? 这就是我的意思。您可以在显示页面中使用 =render "partials/js_partial" 部分加载您的 js。将您的 ajax 部分指向不同的操作。 所以当我渲染部分时,它被渲染为 html 纯文本,而不是 javascript,我怎么能告诉它它是一个 javascript 部分?这条线是:&lt;%= render 'show.js.erb' %&gt; 一个简单的技巧是将其放入脚本标签中。让我看看A.M.看看我有没有更好的答案。【参考方案2】:

也许问题在于首先调用 show 动作, 它缺少remote: true 选项?

如果是链接,请尝试使用 remote: true 选项,例如:

&lt;%= link_to 'Show', simulation_path(my_simulation), remote: true %&gt;

如果是按钮也一样

&lt;%= button_to 'Show', simulation_path(my_simulation), remote: true %&gt;

这应该会导致 Rails 以正确的格式调用控制器,并且在日志中你应该看到提到的 JS,例如

Processing by SimulationsController#show as JS

另外,您可能缺少数据类型,请尝试:

$.ajax(
    type: "PUT",
    url: "/simulations/#params",
    dataType: "script"
)

【讨论】:

以上是关于Rails 中的 respond_to 出现未知格式错误。正确尝试实施轮询更新的主要内容,如果未能解决你的问题,请参考以下文章

Rails respond_to 重定向不起作用

Rails:respond_to 块是如何工作的?

无法使用 Attachinary 在 Heroku 上运行 Rails 控制台:未定义方法 `respond_to' for Attachinary::CorsController:Class

Rails 4 使用 ajax、jquery、:remote => true 和 respond_to 渲染部分

如何限制 Rails 路由文件中的资源格式

Rails:respond_to js 不使用文本呈现是一个字符串