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

时间:2014-12-17 07:10:53

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

我尝试使用ajax渲染部分内容,但由于某种原因,它会返回此错误:

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

我非常困惑,因为我之前完成了一种基本相同格式的东西,而且我从来没有遇到任何问题。有人看到我的代码有什么问题吗?我可以用ajax渲染一个字符串;只有在我尝试渲染部分内容时才会出现错误。顺便说一句,我通过删除format.html行然后直接在浏览器中访问upvoterandom_thing路径来实现此错误。

视图/东西/ 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(&#34; test&#34;)返回&#34; test&#34;,所以问题必须在渲染。

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

视图/东西/ _randajax.html.erb

TEST

这是其他近乎相同的AJAX结构:


视图/东西/ show.html.erb

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

控制器/ 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

视图/评论/ create.js.erb

$('#comments_h2').prepend("<%= j(render(@comment)) %>");

视图/评论/ _comment.html.erb

TEST

3 个答案:

答案 0 :(得分:4)

我会在前面道歉,答案很长。我尝试过以多种方式复制你的问题,但我认为你可能会朝错误的方向发展。我已经包含了整个故事,因此您可以看到它是否匹配,如果不匹配,它有望带来帮助您解决问题的见解。

ActionController::UnknownFormat在视图渲染之前发生

如果Rails向您显示ActionController::UnknownFormat错误,则表示您的控制器不响应所请求的格式。 respond_to方法在您突出显示的确切行上引发错误。

如果在视图渲染过程中出现错误,那么它会在format.htmlformat.js的行中冒泡。因此,在视图渲染部分中肯定不会导致此错误。

重现ActionController::UnknownFormat错误

我可以获得您发布的确切错误消息的唯一方法是,如果我直接在浏览器中请求AJAX响应页面。然后你会看到Rails错误页面,它还会显示请求的格式。您可能正在请求格式为htmljs以外的格式,在这种情况下会触发ActionController::UnknownFormat错误,因为您的控制器会响应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任何格式都可以。这是发生的事情:

  1. ThingsController使用您在respond_to块中定义的第一种格式(HTML格式)进行响应。这会触发重定向到根路径。
  2. jQuery遵循重定向,再次使用*/*格式。
  3. 根路径中的控制器以第一个定义的格式响应,如果没有respond_to块,则默认为HTML。
  4. jQuery然后加载该响应。
  5. ActionController::UnknownFormat再现它时,ThingsController无法从things/1/upvoterandom.js中提出。

    我的想法

    这主要是猜测工作,所以如果我错了请纠正我:

    1. 您点击了upvote远程链接,没有任何明显的事情发生。
    2. 你添加了一个JavaScript来通过AJAX明确地获取页面,但仍然没有明显的事情发生。
    3. 您直接使用浏览器访问了ActionController::InvalidCrossOriginRequest(或类似)页面。在这种情况下,会引发things/1/upvoterandom.json
    4. 您使用浏览器直接访问了ActionController::UnknownFormat(我使用的是JSON,但它可以是HTML或JS以外的任何格式)页面,并且您收到things/1错误。
    5. 如果是这样的话,你需要回到第1步,然后开始向另一个方向重现这个问题:

      1. 转到{{1}}(或其他Thing ID)页面。
      2. 打开浏览器的开发人员工具/ Web检查器。
      3. 转到显示网络通信的视图(在Chrome中,这是名为“网络”的标签页)。
      4. 现在单击该链接,查看浏览器与Rails应用程序之间的通信。如果发生了很多,你通常只能过滤XHR,它只显示AJAX请求。
      5. 如果您看到弹出500状态,则需要检查Rails服务器输出是否存在堆栈跟踪错误。
      6. 我只能猜测问题的实际原因是什么,但我认为渲染视图时实际上可能会出现一些错误,正如您所说,唯一不起作用的情况是渲染部分。我希望这些信息可以帮助您解决问题。

答案 1 :(得分:2)

views/things/upvoterandom.js.erb中,您试图像这样呈现@randajax

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

但我没有看到@randajax被分配到任何地方,这意味着它是nil

尝试呈现nil是导致此问题的原因。但是请先通过以下方式确认:

$('#randomajax').html("<%= j(render(nil)) %>");

如果它返回相同的错误,那么我们就找到了罪魁祸首。

在呈现之前指定@randajax某些内容,或者只使用:

$('#randomajax').html("<%= j(render(path_to_partial)) %>");

答案 2 :(得分:1)

好吧,我还没弄清楚为什么我尝试的语法不起作用,但这种语法确实有效:

$('#randomajax').html("<%= render 'randajax' %>");