哇,我终于解决了这个问题。唷,很多调查,但我一路上学到了很多东西。我将在这里分享我的解决方案。
所以我的情况是我正试图变得干燥,所以我有两个部分用于“添加到收藏夹”和“从收藏夹中删除”按钮。在我的事件管理应用程序中,搜索结果页面显示事件,并且最初呈现“添加到收藏夹”按钮部分。当用户单击按钮时,AJAX 表单提交将该部分替换为“从收藏夹中删除”部分。这样,如果用户改变主意,就可以在添加/删除收藏夹之间切换。
但我也想在用户个人资料页面和收藏夹索引页面上使用那些“添加到收藏夹”/“从收藏夹中删除”部分,并且在这些页面上,当用户单击“从收藏夹中删除”时,我不想要“添加到收藏夹”按钮显示,我想刷新页面,以便收藏夹列表减去已删除的项目。在这种情况下,我根本不进行 AJAX 调用。
为此,我需要一种控制遥控器的方法:对于表单,AJAX 调用为 true,HTML(页面刷新)调用为 false。以下代码(仅显示相关的)是我的做法。
希望这对其他人有帮助。
----------------- 父部分 -----------------
在父部分中,设置 remote_flag: true 可防止通过 AJAX 调用刷新页面,而 remote_flag: false 将是 HTML 调用,用于页面刷新。
<% if current_user.following?(user_event) %>
<%= render partial: 'shared/remove_favorite',
locals: { user_event: user_event, remote_flag: true } %>
<% else %>
<%= render partial: 'shared/add_favorite',
locals: { user_event: user_event, remote_flag: true } %>
<% end %>
------------- 添加喜欢的部分 ----------------
hidden_field :remote_flag 允许控制器通过 params[:remote_flag] 访问。
<%= form_for(current_user.favorites.build(followed_event_id: user_event.id),
html: { id: "event_number_#{user_event.id}" }, remote: remote_flag) do |f| %>
<div class="hidden"><%= f.hidden_field :followed_event_id %></div>
<%= hidden_field_tag :remote_flag, value: remote_flag %>
<%= f.submit "Add to favorites",
class: "info_button_small user_event_summary_item" %>
<% end %>
------------- 删除最喜欢的部分 ----------------
hidden_field :remote_flag 允许控制器通过 params[:remote_flag] 访问。
<%= form_for(current_user.favorites.find_by_followed_event_id(user_event),
html: { id: "event_number_#{user_event.id}", method: :delete }, remote: remote_flag) do |f| %>
<%= hidden_field_tag :remote_flag, value: remote_flag %>
<%= f.submit "Remove from favorites", class: "info_inline_control info_button_small user_event_summary_item" %>
<% end %>
---------------- 收藏夹控制器 ----------------
在控制器中,此代码允许 create.js.erb 和 destroy.js.erb 访问@remote_flag:
@remote_flag = params[:remote_flag]
class FavoritesController < ApplicationController
before_filter :signed_in_user
def create
@remote_flag = params[:remote_flag]
@user_event = UserEvent.find(params[:favorite][:followed_event_id])
current_user.follow!(@user_event)
respond_to do |format|
format.html { redirect_to user_path(current_user) }
format.js
end
end
def show
@user = current_user
end
def destroy
@remote_flag = true
@user_event = Favorite.find(params[:id]).followed_event
current_user.unfollow!(@user_event)
respond_to do |format|
format.html { redirect_to user_path(current_user) }
format.js
end
end
end
--------------- create.js.erb -------
<% if @current_user.following?(@user_event) %>
$("#event_number_<%= @user_event.id %>").replaceWith('<%= escape_javascript(render(
partial: 'shared/remove_favorite', locals: { user_event: @user_event, remote_flag: @remote_flag })) %>');
<% end %>
--------------- destroy.js.erb -------
<% if !@current_user.following?(@user_event) %>
$("#event_number_<%= @user_event.id %>").replaceWith('<%= escape_javascript(render(
partial: 'shared/add_favorite', locals: { user_event: @user_event, remote_flag: @remote_flag })) %>');
<% end %>