如何指定要刷新的页面
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_to
和 action.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 当部分用于某些页面而不是其他页面时。然后当我使用你的答案时,我需要能够传入要重定向到的页面,因为这也会有所不同。以上是关于如何指定要刷新的页面的主要内容,如果未能解决你的问题,请参考以下文章