Rails-使用Ajax删除li元素

Rails - delete li element with Ajax

本文关键字:li 元素 删除 Ajax 使用 Rails-      更新时间:2023-09-26

我有一个用户列表,我想在单击同一行上的"删除"链接时删除元素。

视图:

# users/index.html.erb
<ul class="users">
  <%= render @users %>
</ul>
# users/_user.html.erb
<li id="user-<%= user.id %>">
  <%= link_to user.email, user %>
  <% if current_user.admin? %>
      <%= link_to "delete", user, remote: true, method: :delete, data: { confirm: "You sure?" } %>
  <% end %>
</li>

用户控制器:

# users_controller.rb
def destroy
  User.find(params[:id]).destroy
  flash[:success] = "User deleted"
  respond_to do |format|
    format.html { redirect_to users_url }
    format.js
  end
end

删除列表元素的javascript是:

# users/destroy.js.erb
$("li#<%= user.id %>").remove();

单击时不会发生任何事情,但在页面刷新时,资源被正确销毁。检查服务器的日志我看到以下错误:

在40ms内完成500内部服务器错误(ActiveRecord:5.0ms)

ActionView::Template::错误(未定义的局部变量或方法user' for #<#<Class:0x0000000851d300>:0x00000008e8e7e0>): 1: $("li#<%= user.id %>").remove(); app/views/users/destroy.js.erb:1:in _app_views_users_destroy_js_erb___2066095411338793994_74738360'
app/controllers/users_controller.rb:46:在"销毁"中

你能帮我理解错误在哪里,为什么"用户"没有定义吗?感谢

编辑

我知道有很多问答;a类似于这个问题的,我实际上是根据这些问题构建代码的。尽管如此,我还是被困了,我需要支持。请不要将问题标记为重复。

destroy.js.erb模板没有获取用户变量,因为它是未定义的。尝试:

def destroy
 @user = User.find(params[:id])
 @user.destroy
 respond_to do |format|
  format.html { redirect_to users_url }
  format.js
 end
end

$("li#<%= @user.id %>").remove();

这样做的原因是rails通过设置带有@prefix的变量将数据从控制器传递到视图。因此,您将@user设置为从数据库中获取的模型的一个实例,然后对该模型调用.dedestroy,它被删除了,然后您呈现了destroy.js模板,该模板中也有@user,您删除了与"li#233"选择器匹配的列表项,或任何id整数为的列表项

您没有定义user变量。

您可以将@user_id保存在一个变量中,以便在js.erb中访问。比如:

def destroy
  @user_id = params[:id]  
  ...
end

然后:

$("li#<%= @user_id %>").remove();