0

我想控制何时刷新页面(respond_to format.html)和何时切换按钮(respond_to format.js),通过将局部变量传递给用于远程的部分:true(远程:remote_flag),但该变量remote_flag始终为false .

------------- 父部分 ----------------

<% 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 %>

------------- 添加喜欢的部分 ----------------

<%= 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>
  <%= f.submit "Add to favorites %>
<% end %>

------------- 删除最喜欢的部分 ----------------

<%= 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| %>
  <%= f.submit "Remove from favorites %>
<% end %>
4

2 回答 2

2

@remote_flag是一个实例变量,而不是局部变量,因此它不会通过locals: { user_event: user_event, remote_flag: false }构造传递给部分。由于未设置,因此(默认情况下)nil它的行为类似于false条件语句。相反,您应该使用传递的局部变量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| %>
  <%= f.submit "Remove from favorites %>
<% end %>

并通过locals: {...}构造传递变量或在控制器中显式设置实例变量:

@remote_flag = !!condition
于 2013-07-02T08:29:45.150 回答
1

哇,我终于解决了这个问题。唷,很多调查,但我一路上学到了很多东西。我将在这里分享我的解决方案。

所以我的情况是我正试图变得干燥,所以我有两个部分用于“添加到收藏夹”和“从收藏夹中删除”按钮。在我的事件管理应用程序中,搜索结果页面显示事件,并且最初呈现“添加到收藏夹”按钮部分。当用户单击按钮时,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 %>
于 2013-07-03T07:03:12.107 回答