Rails link_to with remote:true在页面刷新后处理html而不是js

时间:2012-11-13 09:16:55

标签: ruby-on-rails ruby-on-rails-3

我的应用中有一个搜索页面,其中有一个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响应,它触发消息传递面板以向用户弹出消息。所有这一切都正常,检查日志我看到发送的正确的get请求,以及正在处理的正确格式:

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 个答案:

答案 0 :(得分:25)

您的app/assets/javascripts/application.js是否包含

//= require jquery
//= require jquery_ujs 

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

我只是在为HOURS这样的问题挣扎,而这两点的最后一点修正了它;我在其他一些问题中看到了第一点,所以我在这里重复一遍。

希望有所帮助。

Credit where credit's due

答案 1 :(得分:4)

它对我来说是什么解决方案:format =&gt; “JS”

所以在你的情况下:

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

答案 2 :(得分:0)

通常,当您在特定按钮上使用link_to时,按下按钮时,as js请求会发送到控制器,但也会搜索相应的.js.erb文件等等。

答案 3 :(得分:0)

我的解决方案是更换

format.json do

使用

format.js do

您可以通过在控制器中设置断点(我使用pry)然后查看变量来解决请求

request.format