Rails ActiveAdmin:ActiveRecord::RecordNotFound 在 Admin::UsersController#show

Rails ActiveAdmin: ActiveRecord::RecordNotFound in Admin::UsersController#show

我想在活动管理员显示操作中创建按钮以将用户 status:stringinactive 更改为 active。为此,我使用 collection_action 和以下代码:

ActiveAdmin.register User do
  permit_params :email, :password, :password_confirmation, :status

  collection_action :update_status, method: :post do
    user.update!(status: 'active')
    redirect_to user_path, notice: 'User status updated'
  end

然后我渲染自定义部分_show.html.erb

<tr>
  <td colspan='2'>
    <% if @user.status == 'inactive' %>
      <%= link_to 'Activate user', update_status_admin_users_path %>
    <% end %>
  </td>

这是 collection_action

动态生成的 ActiveAdmin

bin/rails routes

update_status_admin_users POST       /admin/users/update_status(.:format)                                                              admin/users#update_status

我没有更新数据,而是收到错误:

ActiveRecord::RecordNotFound in Admin::UsersController#show Couldn't find User with 'id'=update_status

以上错误是因为您正在重定向到 user_path 需要重定向的 id 参数,而当您使用 collection_action 时缺少 id 参数。

如果您打算只更新一个用户,请使用 member_action 而不是 collection_action

  • 使用resource
  member_action : update_status, method: :put do
    resource.update!(status: 'active')
    redirect_to user_path, notice: 'User status updated'
  end
  • 有自己的取景器
  member_action : update_status, method: :put do
    user = User.find(params[:id])
    user.update!(status: 'active')
    redirect_to user_path, notice: 'User status updated'
  end
  <td colspan='2'>
    <% if @user.status == 'inactive' %>
      <%= link_to 'Activate user', update_status_admin_user_path, method: :put %>
    <% end %>
  </td>