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

时间:2019-05-08 07:57:58

标签: ruby-on-rails authentication admin

我正在制作一个只有两种用户的简单应用程序:Admin和SimpleUser。我希望我的Gemfile包含尽可能少的gem,而没有诸如“ devise”之类的任何帮助。

我试图创建一个自定义控制器来处理用户配置文件更新,但据我所知这不是一种RESTful方法,这并不意味着其他控制器可以处理用户参数。

因此,配置文件应该做什么:

SimpleUser:

  
      
  1. 获取用于编辑配置文件设置的网址 localhost:XXXX /配置文件
  2.   
  3. 即使他的ID为7,也无法获得其他用于编辑页面的路线,例如“ / users / 7 / edit”
  4.   
  5. 无法通过“ / users /:id / edit”编辑其他任何页面
  6.   

管理员:

  
      
  1. 获取用于编辑个人资料设置的网址 localhost:XXXX /个人资料
  2.   
  3. 通过“ / users /:id / edit”获取用于编辑任何用户的网址
  4.   

现在,我已经满足了所有管理员要求,而SimpleUser仅达到了第一和第三。我该如何拒绝给用户“ / user / user_id / edit”路径,但仍然能够给他“ / profile”路径,是否可以不处理和重定向URL?

P.S我不是要一段代码,我只是想知道可能的选择,它是如何用红宝石在轨道上完成的

2 个答案:

答案 0 :(得分:0)

您需要在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

答案 1 :(得分:0)

一个选项是将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

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