我尝试使用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
答案 0 :(得分:4)
我会在前面道歉,答案很长。我尝试过以多种方式复制你的问题,但我认为你可能会朝错误的方向发展。我已经包含了整个故事,因此您可以看到它是否匹配,如果不匹配,它有望带来帮助您解决问题的见解。
ActionController::UnknownFormat
在视图渲染之前发生如果Rails向您显示ActionController::UnknownFormat
错误,则表示您的控制器不响应所请求的格式。 respond_to
方法在您突出显示的确切行上引发错误。
如果在视图渲染过程中出现错误,那么它会在format.html
或format.js
的行中冒泡。因此,在视图渲染部分中肯定不会导致此错误。
ActionController::UnknownFormat
错误我可以获得您发布的确切错误消息的唯一方法是,如果我直接在浏览器中请求AJAX响应页面。然后你会看到Rails错误页面,它还会显示请求的格式。您可能正在请求格式为html
或js
以外的格式,在这种情况下会触发ActionController::UnknownFormat
错误,因为您的控制器仅会响应html
或js
格式。
我认为实际问题隐藏在其他地方。
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任何格式都可以。这是发生的事情:
ThingsController
使用您在respond_to
块中定义的第一种格式(HTML格式)进行响应。这会触发重定向到根路径。 */*
格式。respond_to
块,则默认为HTML。当ActionController::UnknownFormat
再现它时,ThingsController
无法从things/1/upvoterandom.js
中提出。
这主要是猜测工作,所以如果我错了请纠正我:
ActionController::InvalidCrossOriginRequest
(或类似)页面。在这种情况下,会引发things/1/upvoterandom.json
。ActionController::UnknownFormat
(我使用的是JSON,但它可以是HTML或JS以外的任何格式)页面,并且您收到things/1
错误。 如果是这样的话,你需要回到第1步,然后开始向另一个方向重现这个问题:
我只能猜测问题的实际原因是什么,但我认为渲染视图时实际上可能会出现一些错误,正如您所说,唯一不起作用的情况是渲染部分。我希望这些信息可以帮助您解决问题。
答案 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' %>");