Ruby on rails 如何使用变量控制表单提交远程?

Ruby on rails 如何使用变量控制表单提交远程?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我想控制何时刷新页面(respond_to format.html)以及何时切换按钮(respond_to format.js),方法是将局部变量传递给用于remote:true(remote:remote_标志)的partial,但该变量remote_标志始终为false -------------父部分---------------- <% if @current_user.following?(@user_event) %> $("#event_number_<%=

我想控制何时刷新页面(respond_to format.html)以及何时切换按钮(respond_to format.js),方法是将局部变量传递给用于remote:true(remote:remote_标志)的partial,但该变量remote_标志始终为false

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

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

-------------添加收藏夹部分----------------

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

@remote\u flag
是一个实例变量,而不是局部变量,因此它不会通过
局部变量:{user\u event:user\u event,remote\u flag:false}
构造传递给分部。由于未设置,它(默认情况下)为
nil
,其行为类似于条件语句中的
false
。相反,您应该使用传递的局部变量,
remote\u 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 %>

@remote\u flag
是一个实例变量,而不是局部变量,因此它不会通过
局部变量:{user\u event:user\u event,remote\u flag:false}
构造传递给分部。由于未设置,它(默认情况下)为
nil
,其行为类似于条件语句中的
false
。相反,您应该使用传递的局部变量,
remote\u 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 %>

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

所以我的场景是,我正在尝试干燥,所以我有两个部分用于“添加到收藏夹”和“从收藏夹中删除”按钮。在我的事件管理应用程序中,搜索结果页面显示事件,最初显示“添加到收藏夹”按钮。当用户单击按钮时,AJAX表单提交将该部分替换为“从收藏夹中删除”部分。这样,如果用户改变主意,可以在添加到收藏夹和从收藏夹中删除收藏夹之间切换

但我也希望在用户配置文件页面和收藏夹索引页面上使用“添加到收藏夹”/“从收藏夹中删除”部分,在这些页面上,当用户单击“从收藏夹中删除”时,我不希望显示“添加到收藏夹”按钮,我希望刷新页面,以便收藏夹列表减去删除的项目。在本例中,我不做AJAX调用

为了实现这一点,我需要一种方法来控制远程:对于表单,true用于AJAX调用,false用于HTML(页面刷新)调用。下面的代码(仅显示相关的代码)是我如何完成的

希望这对其他人有帮助

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

<% 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 %>
<% 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 %>
在父部分中,设置remote\u flag:true可以防止通过AJAX调用进行页面刷新,而remote\u 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 %>

-------------添加收藏夹部分----------------

<% 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 %>
<% 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 %>
隐藏的_字段:remote_标志允许控制器通过params[:remote_标志]进行访问

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

-------------删除收藏夹部分----------------

<% 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 %>
<% 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 %>
隐藏的_字段:remote_标志允许控制器通过params[:remote_标志]进行访问

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

----------------收藏夹控制器----------------

<% 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 %>
<% 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 %>
在控制器中,此代码允许create.js.erb和destroy.js.erb访问@remote_标志:

@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
@remote\u flag=params[:remote\u flag]
类FavoritesController<应用程序控制器
前\u筛选器:已签名的\u-in\u用户
def创建
@远程_标志=参数[:远程_标志]
@user\u event=UserEvent.find(参数[:favorite][:followed\u event\u id])
当前用户。请跟随!(@user_事件)
回应待办事项|格式|
format.html{重定向到用户路径(当前用户)}
format.js
结束
结束
def秀
@用户=当前用户
结束
def销毁
@远程_标志=真
@用户\u事件=收藏夹。查找(参数[:id])。跟随\u事件
当前用户。请继续!(@user_事件)
回应待办事项|格式|
format.html{重定向到用户路径(当前用户)}
format.js
结束
结束
结束
---------------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 %>
<% 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 %>

$(“事件编号”)。替换为(“”);
---------------destroy.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 %>
<% 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 %>

$(“事件编号”)。替换为(“”);

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

所以我的场景是,我正在尝试干燥,所以我有两个部分用于“添加到收藏夹”和“从收藏夹中删除”按钮。在我的事件管理应用程序中,搜索结果页面显示事件,最初显示“添加到收藏夹”按钮。当用户单击按钮时,AJAX表单提交将该部分替换为“从收藏夹中删除”部分。这样,如果用户改变主意,可以在添加到收藏夹和从收藏夹中删除收藏夹之间切换

但我也希望在用户配置文件页面和收藏夹索引页面上使用“添加到收藏夹”/“从收藏夹中删除”部分,在这些页面上,当用户单击“从收藏夹中删除”时,我不希望显示“添加到收藏夹”按钮,我希望刷新页面,以便收藏夹列表减去删除的项目。在本例中,我不做AJAX调用

为了实现这一点,我需要一种方法来控制远程:对于表单,true用于AJAX调用,false用于HTML(页面刷新)调用。下面的代码(仅显示相关的代码)是我如何完成的

希望这对其他人有帮助

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

<% 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 %>
<% 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 %>
在父部分中,设置remote\u flag:true可以防止通过AJAX调用进行页面刷新,而remote\u 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 %>

-------------添加收藏夹部分----------------

<% 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 %>
<% 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 %>
隐藏的_字段:remote_标志允许控制器通过params[:remote_标志]进行访问

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

-------------删除收藏夹部分----------------

<% 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 %>
<% 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 %>
隐藏的_字段:remote_标志允许控制器通过params[:remote_标志]进行访问

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

--