【问题标题】:Rails link_to remote true issue when with browser history使用浏览器历史记录时,Rails link_to remote true 问题
【发布时间】:2016-08-25 12:51:44
【问题描述】:

我正在使用以下代码通过搜索页面上的 JS 请求获取数据

<%= link_to 'All', '/search?type=all', id: 'active', remote: true %>
<%= link_to 'Photographers', '/search?type=photographers', remote: true %>

一切正常,我正在按预期获取数据。但是当我点击其他链接然后点击返回按钮(由浏览器提供)时,它会在空白页面上向我显示 JS 请求数据,而不是返回搜索页面。

是否有任何解决方法或解决方法?

在 routes.rb 中

resources :search, only: [:index]

在搜索控制器中

def index
  // search processing

  respond_to do |format|
    format.html
    format.js
  end
end

搜索/index.js.erb

$('#search-area').html("<%= j render partial: 'search_area' %>");

我正在使用带有 Puma 的 Rails 5.0

【问题讨论】:

  • 包含您的控制器和路由,以帮助我们更好地理解您的代码
  • @NirajanPokharel 添加了
  • 听起来后退按钮正在返回上一个请求,即来自您的 remote: true 链接的 AJAX 请求。奇怪的。你用的是什么服务器?标准的 Rails 开发服务器一次只能处理一个请求,这可能是造成这种情况的原因。尝试使用puma 作为开发服务器,看看问题是否仍然存在
  • 或者查看您的search.js 视图文件。根据您的 JS 实现,您可能只有一个空页面,而搜索 JS 正在运行。
  • @Killerpixler 更新了帖子,我正在使用带有 Puma 的 Rails 5

标签: javascript ruby-on-rails ajax


【解决方案1】:

正如我所想。后退按钮转到最后一个请求,即 JS 文件。它所做的只是渲染一个部分,但由于它没有一个基本模板可以从你得到的只是来自部分的搜索数据。

到目前为止,我让 AJAX 部分工作的方式是在 .html.erb 文件中添加一个 div 标签(或任何带有 ID 的标签)。例如来自具有 AJAX 可排序表的项目:

index.html.erb

...
<div class="card card-block" id="article-index">
    <%= render 'indextable' %>
</div>
...

index.js.erb

$("#article-index").html("<%= escape_javascript(render("indextable")) %>");

两者都引用了我要呈现的表数据的一部分。诀窍是在.js.erb 文件中使用将innerHTML 设置为rails escape_javascript(render..) 调用的语法。这样,返回导航将从另一个页面返回到搜索结果页面。

试一试,让我知道它是否成功。很可能您将获得呈现的搜索结果页面的 HTML 模板,但没有任何数据。 AJAX 通常不适用于浏览器的后退按钮。

【讨论】:

  • 是的,浏览器像往常一样跟踪远程链接访问,我试过你的代码,但还是一样
  • 我找到了一种解决方法来防止浏览器页面缓存 stackoverflow.com/questions/711418/… 但是我认为这可能是一个错误或其他问题,因为它是 Rails 应用程序中的常见用例
  • 您是在什么环境下遇到这个问题的? developmentproduction?
  • 在开发环境中
猜你喜欢
  • 2015-06-14
  • 2013-05-21
  • 1970-01-01
  • 2013-11-10
  • 2010-09-08
  • 2010-10-20
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多