我正在尝试用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.html
或format.js
在行中冒泡。因此,肯定不会在 View 渲染部分中引起此错误。
重现ActionController::UnknownFormat
错误
我可以获取您发布的确切错误消息的唯一方法是,如果我直接在浏览器中请求AJAX响应页面。然后,您会看到Rails错误页面,该页面还将向您显示处理请求的格式。您可能请求的页面格式不是html
或js
,在这种情况下会触发ActionController::UnknownFormat
错误,因为您的 Controller 仅响应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
(我使用JSON,但是它可以是HTML或JS之外的任何其他格式)页面,并且出现了ActionController::UnknownFormat
错误。 如果是这种情况,则需要返回到步骤1,并开始从另一个方向重现该问题:
things/1
(或另一个Thing ID)页面。 我只能猜测出问题的真正原因是什么,但我认为渲染 View 时实际上可能是一些错误。正如您所说,唯一不起作用的情况是渲染部分 View 。希望这些信息可以帮助您解决问题。
关于javascript - j(render(@partial))返回错误:ActionController::UnknownFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27520053/