15

我的应用程序中有一个搜索页面,其中有一个 ajax 搜索表单。搜索表单正常工作,将参数传递给模型以过滤搜索,模型返回结果集合。搜索提交后,@results 会在页面上呈现。然后每个@result 都有一个指向其上的操作的链接,例如:

<%=link_to "Message", message_user_path(:id => user.id), :remote => true%>

控制器中的此操作在哪里:

respond_to :js, :html
def message
  @user_id = params[:id]
  @user = User.find_by_id(@user_id)
  respond_to do |format|
    format.html
    format.js
  end
end

这会以 message.js.erb 进行响应,这会触发消息面板弹出给用户的消息。所有这些都正常工作,检查日志我看到发送了正确的获取请求,并且正在处理正确的格式:

Started GET "/users/3/message"
Processing by UsersController#message as JS

但是,如果我刷新页面并尝试单击之前工作的相同链接,则会收到错误模板缺失。检查日志,我看到现在发送了两个请求,第一个是 html,然后是同一个 js 请求。

Started GET "/users/4/message"
Processing by StudentsController#message as HTML
...
Completed 406 Not Acceptable in 3ms (ActiveRecord: 1.0ms)

Started GET "/users/4/message"
Processing by StudentsController#message as JS

html 请求引发缺少模板错误。有谁知道为什么刷新页面会导致 rails 尝试使用对远程链接的 html 请求进行响应?
编辑:routes.rb

resources :students do
    member do
      get 'message'
    end
end
4

5 回答 5

27

你是否app/assets/javascripts/application.js包含

//= require jquery
//= require jquery_ujs 

?

你的erb包含<%= javascript_include_tag "application" %>

我只是在几个小时内一直在努力解决这样的问题,而这两点中的最后一点解决了它;我看到其他一些问题中提到的第一点,所以我会在这里重复一遍。

希望有帮助。

信用到期的信用

于 2013-06-01T17:18:05.420 回答
8

它对我来说是什么解决方案是添加 :format => "js"

所以在你的情况下:

<%=link_to "Message", message_user_path(:id => user.id, :format => "js"), :remote => true %>
于 2015-01-24T23:34:23.353 回答
0

一般来说,当你link_to在一个特定的按钮上使用时,当你按下按钮时,as js请求被发送到控制器,但也会搜索相应的 .js.erb 文件等等。

于 2015-01-15T20:46:32.410 回答
0

我的解决方案是更换

format.json do

format.js do

您可以通过在控制器中设置断点(我使用 pry)对请求进行故障排除,然后查看变量

request.format
于 2019-01-12T18:02:55.727 回答
0

对于较新版本的 Rails,这应该remote: truelink_to代码中使用时得到修复,就像原始海报所做的那样,只会寻找一种.js格式来响应。正如其他人所说,如果您从不需要 html 响应,那么您可以将其从代码中一起删除;您甚至不需要respond_to,respond_with等,因为 Rails 会自动响应 JS 寻找您已经制作的模板。所以你的控制器代码看起来像这样:

def message
  @user_id = params[:id]
  @user = User.find_by_id(@user_id)
end

链接仍然是这样的:

<%=link_to "Message", message_user_path(:id => user.id), :remote => true %>

或者这也可以(我首​​选的语法方式):

<%=link_to "Message", message_user_path(id: user.id), remote: true %>

此代码将调用将查找模板的控制器操作message.js.erb

我知道这个问题现在已经过时了,但是对于任何正在寻找答案并使用当前 Rails 6+(我使用的是 7.0.0alpha)的人,如果您遇到同样类型的问题,同时请求 HTML 和 JS 模板;检查 turbolinks 不是导致问题的原因。有时 turbolink 会导致请求被发送两次,并且它可能将第一个请求作为 HTML 请求发送。

于 2021-08-30T17:34:02.390 回答