javascript - j(render(@partial))返回错误:ActionController::UnknownFormat

标签 javascript ruby-on-rails ruby ajax ruby-on-rails-4

我正在尝试用ajax渲染部分图像,但是由于某种原因,它返回此错误:

ActionController::UnknownFormat in ThingsController#upvoterandom
ActionController::UnknownFormat

我很困惑,因为我以前用基本上相同的格式完成了某些工作,而且我从没有遇到任何问题。有人看到我的代码有什么问题吗?我可以用ajax渲染一个字符串。只有当我尝试渲染部分图像时,我才会收到错误。顺便说一句,我删除了format.html行,然后直接在浏览器中访问了upvoterandom_thing路径,从而实现了此错误。

views/things/show.html.erb
<div id= "randomajax" >
    <div id="randajax">
      <%= link_to @rand.name, thing_path(@rand) %>
      <%= link_to image_tag("UpArrowGray.jpg", class: "rand_up_vote"), remote: true, %>
      <script type="text/javascript">
        function reload_script() {
            $(".rand_up_vote").click(function () {
              $.get( "<%= upvoterandom_thing_path(:id => @rand.id) %>", function( data ) {
              });
            });
        }
        reload_script();
      </script> 
    </div>
</div>

controllers/things_controller.rb 我将星号放在错误突出显示的行周围。
def upvoterandom
  @thing = Thing.find(params[:id])
  #...
  ***respond_to do |format|***
    format.html { redirect_to root_path }
    format.js
  end
end

views/things/upvoterandom.js.erb: .html(“test”)返回“test”,因此问题必须出在渲染中。
$('#randomajax').html("<%= j(render(@randajax)) %>");

views/things/_randajax.html.erb
TEST

这是另一种可行的近乎相同的AJAX结构:

views/things/show.html.erb
<%= form_for([@thing, @comment], remote: true) do |f| %>
  <%= f.text_area :text %>
  <%= f.submit "Post", id: "postacomment" %>
<% end %>

Controller /comments_controller.rb
def create
  @thing = Thing.find(params[:thing_id])
  @comment = @thing.comments.create(comment_params)
  respond_to do |format|
    format.html { redirect_to root_path }
    format.js
  end
end

View /评论/create.js.erb
$('#comments_h2').prepend("<%= j(render(@comment)) %>");

views/comments/_comment.html.erb
TEST

最佳答案

对于很长的答案,我会在前面道歉。我试图以多种方式重现您的问题,但我认为您的方向可能不对。我已经包括了整个故事,因此您可以查看是否全部匹配,如果不匹配,则可以带来有助于您解决问题的见解。
ActionController::UnknownFormat在 View 渲染之前发生

如果Rails向您显示ActionController::UnknownFormat错误,则意味着您的 Controller 不响应所请求的格式。该错误是由respond_to方法在您突出显示的确切行上引起的。

如果在 View 渲染期间引发了错误,则该错误会通过format.htmlformat.js在行中冒泡。因此,肯定不会在 View 渲染部分中引起此错误。

重现ActionController::UnknownFormat错误

我可以获取您发布的确切错误消息的唯一方法是,如果我直接在浏览器中请求AJAX响应页面。然后,您会看到Rails错误页面,该页面还将向您显示处理请求的格式。您可能请求的页面格式不是htmljs,在这种情况下会触发ActionController::UnknownFormat错误,因为您的 Controller 仅响应htmljs格式。

我认为实际问题隐藏在其他地方。

views/things/show.html.erb复制

我也尝试从views/things/show.html.erb页面重现该错误。使用您的原始代码执行此操作时,在以下行中出现语法错误:

<%= link_to image_tag("UpArrowGray.jpg", class: "rand_up_vote"), remote: true, %>

这是由于remote: true之后的逗号引起的。因此,我假设您没有一直在使用远程链接进行测试。在没有remote: true的情况下进行测试时,reload_script函数将触发jQuery AJAX请求。您可以使用以下代码行执行此操作:
$.get( "<%= upvoterandom_thing_path(:id => @rand.id) %>", function( data ) {
});

实际上,这会触发格式为*/*的XHR请求。它基本上告诉Rails任何格式都可以。这是发生了什么:
  • ThingsControllerrespond_to块中定义的第一种格式(HTML格式)响应。这将触发重定向到您的根路径。
  • jQuery遵循重定向,再次使用*/*格式。
  • 根路径上的 Controller 以第一种定义的格式进行响应,如果不存在respond_to块,则默认情况下为HTML。
  • 然后jQuery加载该响应。

  • 像这样复制它时,不可能从ActionController::UnknownFormat引发ThingsController

    我的想法

    这主要是猜测工作,所以如果我错了,请纠正我:
  • 您单击了upvote远程链接,但没有任何明显 react 。
  • 您添加了JavaScript以通过AJAX显式获取页面,但是仍然没有明显的 react 。
  • 您直接使用浏览器访问了things/1/upvoterandom.js(或类似)页面。在这种情况下,将生成ActionController::InvalidCrossOriginRequest
  • 您直接用浏览器访问了things/1/upvoterandom.json(我使用JSON,但是它可以是HTML或JS之外的任何其他格式)页面,并且出现了ActionController::UnknownFormat错误。

  • 如果是这种情况,则需要返回到步骤1,并开始从另一个方向重现该问题:
  • 转到things/1(或另一个Thing ID)页面。
  • 打开浏览器的开发人员工具/Web检查器。
  • 转到显示网络通信的 View (在Chrome中,这是一个称为网络的选项卡)。
  • 现在,单击链接,查看浏览器与Rails应用程序之间发生了什么通信。如果发生很多情况,通常只能过滤XHR,而XHR仅显示AJAX请求。
  • 如果您看到在那里弹出500状态,则需要检查Rails服务器输出中是否有stacktrace错误。

  • 我只能猜测出问题的真正原因是什么,但我认为渲染 View 时实际上可能是一些错误。正如您所说,唯一不起作用的情况是渲染部分 View 。希望这些信息可以帮助您解决问题。

    关于javascript - j(render(@partial))返回错误:ActionController::UnknownFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27520053/

    相关文章:

    ruby - 如何在我的类上动态设置 HTTParty 配置参数?

    javascript - Handlebars 选择框填充

    javascript - 为什么再次悬停时下拉菜单动画会削高?

    ruby-on-rails - Rails 项目中的 rake 范围?

    mysql - 安装 Jackhammer 时出现 Ruby on Rails 登录错误

    ruby - 有没有办法直接运行 ruby 鞋应用程序?

    ruby-on-rails - 用于将唯一项插入数组的 Ruby 条件

    Javascript/ lambda : How to make the following code functional

    javascript - PHP - 如果文件存在则运行 JavaScript

    ruby-on-rails - Rails 项目无法启动 - 意外错误 : expecting $end