Rails ActiveAdmin: ActiveRecord::Запись не найдена в администраторе::пользовательскийконтроллер#показать

#ruby-on-rails #activeadmin

Вопрос:

Я хочу создать кнопку для изменения пользователя status:string inactive 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>
 

Вот что ActiveAdmin генерирует динамически collection_action

bin/rails routes

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

Вместо обновления данных я получаю сообщение об ошибке:

ActiveRecord::Запись не найдена в Admin::UserController#показать Не удалось найти пользователя с ‘id’=update_status

Ответ №1:

Вышеуказанная ошибка связана с тем, что вы перенаправляете на user_path id тот параметр, для которого требуется перенаправление, и, поскольку вы используете id параметр collection_action, отсутствует.

Если вы намерены обновить только одного пользователя, используйте 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>
 

Комментарии:

1. Я получаю сообщение об ошибке: Routing Error No route matches [GET] "/admin/users/1/update_status"

2. @mr_muscle я пропустил, чтобы установить method значение link_to. Я обновил ответ. не могли бы вы, пожалуйста, проверить сейчас.

3. Там также должна быть user = User.find(params[:id]) первая строка member_action

4. @mr_muscle ой, мой плохой, тогда ты можешь использовать resource вместо пользователя. Я обновлю свой ответ