Как избежать дублирования маршрутов для страницы редактирования пользователя? - PullRequest
0 голосов
/ 08 мая 2019

Я делаю простое приложение, которое имеет только два вида пользователей: Admin и SimpleUser. Я хочу, чтобы мой Gemfile содержал как можно меньше драгоценных камней без каких-либо помощников, таких как 'devise'.

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

Итак, что должны делать профили:

SimpleUser:

  1. получить URL localhost: XXXX / profile для редактирования настроек профиля
  2. не сможет получить другие маршруты для редактирования страницы, такие как "/ users / 7 / edit", даже если у него есть идентификатор 7
  3. не сможет редактировать другие страницы через "/ users /: id / edit"

Администратор:

  1. получить url localhost: XXXX / profile для редактирования настроек личного профиля
  2. получить URL для редактирования любого пользователя через "/ users /: id / edit"

Сейчас я выполнил все требования администратора и только первый и третий для SimpleUser. Как я могу отклонить указание пути к пользователю "/ user / user_id / edit", но при этом предоставить ему "/ profile", возможно ли это без обработки и перенаправления URL-адреса?

P.S Я не прошу кусок кода, я просто хочу знать возможные варианты, как это делается с ruby ​​на рельсах

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Один из вариантов - установить route.rb как:

namespace :admin do
  resources :users
end

resource :user, only: [:show, :edit, :update]

Выполните rake routes в консоли, чтобы убедиться, что вы можете получить доступ ко всем этим действиям как администратор (обратите внимание на : id параметр):

        Prefix  Verb    URI Pattern                      Controller#Action
   admin_users   GET    /admin/users(.:format)           admin/users#index
                POST    /admin/users(.:format)           admin/users#create
 new_admin_user  GET    /admin/users/new(.:format)       admin/users#new
edit_admin_user  GET    /admin/users/:id/edit(.:format)  admin/users#edit
     admin_user  GET    /admin/users/:id(.:format)       admin/users#show
               PATCH    /admin/users/:id(.:format)       admin/users#update
                 PUT    /admin/users/:id(.:format)       admin/users#update
              DELETE    /admin/users/:id(.:format)       admin/users#destroy

Пока пользователь может только (примечание: id отсутствует):

   Prefix  Verb    URI Pattern              Controller#Action
edit_user   GET    /user/edit(.:format)     users#edit
     user   GET    /user(.:format)          users#show
          PATCH    /user(.:format)          users#update
            PUT    /user(.:format)          users#update

Таким образом, у вас есть разные контроллеры для администратора и для пользователя.

0 голосов
/ 08 мая 2019

Вам нужно before_action на вашем UsersController, чтобы проверить, является ли пользователь обычным пользователем, если это так, перенаправьте его на /profile.Предполагая, что /profile сопоставлен с show действием:

class UsersController < ApplicationController
  before_action :check_user, except: [:show]

  private
    def check_user
      redirect_to @user unless @user.admin?
    end
end
...