如何避免复制用户编辑页面的路由



我正在制作一个仅有两种用户的简单应用程序:admin和simpleuser。我希望我的gemfile在没有任何助手(例如"设计"(的情况下,尽可能少的宝石。

我试图创建一个用于处理用户配置文件更新的自定义控制器,但据我所知,这不是一种静止的方法,这并不意味着用户参数正在由其他控制器处理。

所以,哪些配置文件应该做什么:

简单用户:

  1. 获取URL localhost:xxxx/profile 用于编辑配置文件设置
  2. 无法获得任何其他用于编辑页面的路由,例如"/用户/7/编辑",即使他有ID 7
  3. 无法通过"/users/:id/edit"编辑任何其他页面

管理员:

  1. 获取URL localhost:xxxx/profile 用于编辑个人资料设置
  2. 获取用于通过"/users/:id/edit"编辑任何用户的URL

现在,我已经达到了所有管理员的要求,而对于SimpleUser来说,我只有第一和第三。我该如何拒绝给用户"/user/user_id/edit"路径,但仍然可以给他"/profile",在不处理和重定向URL的情况下可能会有可能吗?

p.s我不是在要求一件代码,我只是想知道可能的选择,raby on Rails

您需要UsersController上的before_action检查用户是否是常规用户,如果她将其重定向到/profile。假设/profile映射到show操作:

class UsersController < ApplicationController
  before_action :check_user, except: [:show]
  private
    def check_user
      redirect_to @user unless @user.admin?
    end
end

一个选项是将ROUTES.RB设置为:

namespace :admin do
  resources :users
end
resource :user, only: [:show, :edit, :update]

在控制台中执行rake routes,以检查Admin,您可以访问所有这些操作(请注意: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

因此,您对管理员和用户有不同的控制器。