我正在制作一个只有两种用户的简单应用程序:Admin和SimpleUser。我希望我的Gemfile包含尽可能少的gem,而没有诸如“ devise”之类的任何帮助。
我试图创建一个自定义控制器来处理用户配置文件更新,但据我所知这不是一种RESTful方法,这并不意味着其他控制器可以处理用户参数。
因此,配置文件应该做什么:
SimpleUser:
- 获取用于编辑配置文件设置的网址 localhost:XXXX /配置文件
- 即使他的ID为7,也无法获得其他用于编辑页面的路线,例如“ / users / 7 / edit”
- 无法通过“ / users /:id / edit”编辑其他任何页面
管理员:
- 获取用于编辑个人资料设置的网址 localhost:XXXX /个人资料
- 通过“ / users /:id / edit”获取用于编辑任何用户的网址
现在,我已经满足了所有管理员要求,而SimpleUser仅达到了第一和第三。我该如何拒绝给用户“ / user / user_id / edit”路径,但仍然能够给他“ / profile”路径,是否可以不处理和重定向URL?
P.S我不是要一段代码,我只是想知道可能的选择,它是如何用红宝石在轨道上完成的
答案 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
因此您拥有用于管理员和用户的不同控制器。