Rails Devise: как обновить пользователя по id? - PullRequest
0 голосов
/ 11 октября 2019

Я бы хотел обновить пользователя по id. Я не знаю, нужно ли мне создать другую функцию или использовать функцию обновления устройства.

Это не работает, обновляет моего текущего пользователя вместо пользователя с идентификатором данных (я обновляю своего пользователя по axiosвызов API):

const data = {
  user = {
    first_name: 'firstNameChanged'
    id: 10
  }
};
axios.put('http://localhost:3000/users', data).then((res) => {
  console.log('user updated');
});

РЕДАКТИРОВАТЬ:

route.rb

  devise_for :users, defaults: { format: :json }, controllers: { registrations: "registrations" }
  devise_scope :user do
    delete 'users/:id', to: 'registrations#destroy_by_id', defaults: { format: :json } # custom delete_by_id
  end

  rake routes

        new_user_session GET    /users/sign_in(.:format)                                                       devise/sessions#new {:format=>:json}
            user_session POST   /users/sign_in(.:format)                                                       devise/sessions#create {:format=>:json}
    destroy_user_session DELETE /users/sign_out(.:format)                                                      devise/sessions#destroy {:format=>:json}
       new_user_password GET    /users/password/new(.:format)                                                  devise/passwords#new {:format=>:json}
      edit_user_password GET    /users/password/edit(.:format)                                                 devise/passwords#edit {:format=>:json}
           user_password PATCH  /users/password(.:format)                                                      devise/passwords#update {:format=>:json}
                         PUT    /users/password(.:format)                                                      devise/passwords#update {:format=>:json}
                         POST   /users/password(.:format)                                                      devise/passwords#create {:format=>:json}
cancel_user_registration GET    /users/cancel(.:format)                                                        registrations#cancel {:format=>:json}
   new_user_registration GET    /users/sign_up(.:format)                                                       registrations#new {:format=>:json}
  edit_user_registration GET    /users/edit(.:format)                                                          registrations#edit {:format=>:json}
       user_registration PATCH  /users(.:format)                                                               registrations#update {:format=>:json}
                         PUT    /users(.:format)                                                               registrations#update {:format=>:json}
                         DELETE /users(.:format)                                                               registrations#destroy {:format=>:json}
                         POST   /users(.:format)                                                               registrations#create {:format=>:json}
                         DELETE /users/:id(.:format)                                                           registrations#destroy_by_id {:format=>:json}

спасибо!

Ответы [ 2 ]

1 голос
/ 11 октября 2019

У Devise на самом деле есть только маршруты и контроллеры для изменения вашей учетной записи. Если вы хотите, чтобы интерфейс администрировал других пользователей, лучше всего просто создать его самостоятельно или найти существующую реализацию.

Несмотря на то, что эта функциональность безусловно возможна в Devise, она только испортится и нарушит SRP , поскольку ваш RegistrationsController больше не только отвечает за обработку регистрации пользователей, но и за администрирование других пользователей.

Вы можете в значительной степени просто работать с эшафотами Rails (rails g scaffold users --skip-migration --skip-model), поскольку это не так уж и отличаетсяот CRUD'ов любого другого ресурса. Что вам действительно нужно, так это что-то вроде:

# routes.rb
resources :users, except: [:new, :create]
# This controller is for administrating other users
class UsersController < ApplicationController
   # ensures that there is a logged in user
   # you should also implement authorization that ensures that the user is allowed to administrate other users
   before_action :authenticate_user! 
   # sets the user to be acted upon
   before_action :set_user, only: [:show, :edit, :update, :destroy]

   # PUT|PATCH /users/1
   def update
     if @user.update(user_params)
       head :ok
     else
       head :unprocessable_entity
     end
   end

   # ...
   private

   def set_user 
     @user = User.find(params[:id])
   end

   def user_params
     params.require(:user).permit(:first_name)
   end
end
const data = {
  user = {
    first_name: 'firstNameChanged'
  }
};
axios.put('http://localhost:3000/users/10', data).then((res) => {
  console.log('user updated');
});
0 голосов
/ 11 октября 2019

Проверьте свой rake routes | grep user, и вы найдете запись под PUT. Путь будет выглядеть как /users/:id, это ваша первая ошибка. Это также отображает (обычно) действие UsersController#update.

Затем вы можете получить доступ к id, который передается через параметры (также используйте сильные параметры), и найти своего пользователя с помощью User.find_by(id: permitted_params[:id]). Вы можете создать приватный метод с именем permitted_params в соответствии с

def permitted_pararms
  params.permit(:id)
end
...