Ruby on rails 如何使用变量控制表单提交远程?
我想控制何时刷新页面(respond_to format.html)以及何时切换按钮(respond_to format.js),方法是将局部变量传递给用于remote:true(remote:remote_标志)的partial,但该变量remote_标志始终为false -------------父部分----------------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_<%=
<% 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 %>
--