#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
вместо пользователя. Я обновлю свой ответ