如何指定要刷新的页面

Posted

技术标签:

【中文标题】如何指定要刷新的页面【英文标题】:How do I specify what page to refresh 【发布时间】:2013-06-29 12:05:45 【问题描述】:

在搜索结果页面上,我有使用 respond_to 和 format.js 的“添加到收藏夹”和“从收藏夹中删除”按钮部分,因此页面不会刷新,但页面会在显示“添加到收藏夹”和“从收藏夹中删除”按钮部分。效果很好。

但是在用户的“我的收藏夹”页面和他们的个人资料页面上,如果用户单击“从收藏夹中删除”按钮,我确实想刷新页面,以便不再显示已删除的收藏夹。

我可以控制何时刷新页面 (respond_to format.html) 和何时切换按钮 (respond_to format.js),方法是将局部变量传递给用于 remote: true (remote: @refresh_page) 的局部变量,但在收藏夹控制器,format.html 设置为 redirect_to users_path。

那么我怎样才能将一个变量从部分发送到控制器销毁操作方法,告诉它重定向到哪里?

这是部分内容:

<%= form_for(current_user.favorites.find_by_followed_event_id(user_event),
  html:  id: "event_number_#user_event.id", method: :delete , remote: @refresh_page) do |f| %>
  <%= f.submit "Remove from favorites %>
<% end %>

【问题讨论】:

为什么要使用form 来添加/删除收藏夹? link_to 我认为一个动作就足够了,在该链接中,您将使用 remote: true 进行 ajax,并发送您需要的任何参数,但是当您使用 ajax 执行此操作时,您不需要重定向,只需添加正确的 js在action_name.js.erb 文件中将一个部分替换为另一个。 正如我在问题中所说,在搜索结果页面上,我不想刷新,而是在添加和删除按钮之间切换,这很好。但是在我的收藏页面上,我确实想刷新,所以收藏会完全消失。我想我不能刷新,只是为用户更新收藏夹,但这意味着与用于切换按钮的格式不同。所以我需要不同的行为,具体取决于使用部分的位置。我正在努力保持干爽。 因此,您只需刷新即可从列表中删除收藏的对象,您也可以使用我的示例使收藏消失,在您的 action.js.erb 文件中,您必须使用 javascript删除收藏夹所在的div,这样当你点击从收藏夹中删除时,js会从页面中删除该元素。 我可以让 action.js.erb 文件删除元素,但取决于使用部分的位置,而不是删除元素,我需要在添加和删除按钮之间切换,如所述在问题中。也许我需要在 action.js.erb 中编写更多智能代码。 "也许我需要在 action.js.erb 中编写更多智能代码" - 是的,你这样做了.. 你可以在 link_toaction.js.erb 中发送一个特殊参数,你可以检查 @ 987654328@ param 存在,而不仅仅是删除收藏的元素 else 切换按钮。 【参考方案1】:

!注意,只是一个例子,不是复制/粘贴准备好的代码:

搜索页面

这里你需要检查对象是否已经在收藏夹列表中

  <div class="fav_toggle">
    <%= link_to "Add to favorites", toggle_favorites_path(object, action: 'toggle'), remote: true %>
  </div>

我的收藏页面

  <div class="fav_toggle">
    <%= link_to "Remove from favorites", toggle_favorites_path(object, action: 'remove'), remote: true %>
  </div>

假设toggle_favorites_path 中的routes.rb 指向some_controller#fav_toggle

def fav_toggle
  some logic here to check if fav exists or not and act as needed
  add/remove favorite
end

fav_toggle.js.erb

<% if params[:action] == toggle %>
  $('.fav_toggle').html('<%= link_to "Remove from favorites", add_to_favorites_path(object, action: 'toggle'), remote: true %>');
<% else %>
  $('.fav_toggle').fadeOut().remove();
<% end %>

您需要处理此代码才能使其正常工作,最终您会得到您所期望的。

【讨论】:

【参考方案2】:

表单中的隐藏字段怎么样?像这样:

<%= hidden_field_tag :redirect_path, root_path %>

然后在你的控制器中:

params[:redirect_path]

【讨论】:

【参考方案3】:

我了解,您想调用 favourite#destroy 但希望在您的控制器中使用一个开关来指定 redirect_to 目标。

一种方法是将附加信息作为 url 参数或隐藏字段提交。

<%= form_for(current_user.favorites.find_by_followed_event_id(user_event),
  html:  id: "event_number_#user_event.id", method: :delete , remote: @refresh_page) do |f| %>
  <%= hidden_field_tag :return_to, 'your_target' %>
  <%= f.submit "Remove from favorites %>
<% end %>

在你的控制器中

...
if params[:return_to]=='your_target'
  redirect_to 'where_ever'
else
  redirect_to users_path
end

【讨论】:

我认为你的建议会奏效,但首先我需要回答这个问题:***.com/questions/17420729/… 因为我需要 remote: true 当部分用于某些页面而不是其他页面时。然后当我使用你的答案时,我需要能够传入要重定向到的页面,因为这也会有所不同。

以上是关于如何指定要刷新的页面的主要内容,如果未能解决你的问题,请参考以下文章

js 怎么定时刷新指定页面

js如何刷新页面

php如何避免刷新页面重复提交

vue如何只刷新当前页面

请问html页面有没有办法做到局部刷新,指定某一个div刷新?

html页面中,如何没有鼠标操作时刷新页面(如鼠标不动5分钟刷新一下页面)