轨添加/管理员路由时,管理员日志中
在我的项目我有一个用户模式和广告模式。用户模型也包含管理员。我想设置路由,以便管理员登录时,所有URL都包含“/ admin”。我是新来的铁轨,并有相同的麻烦。例如,当普通用户登录时,url为/ advertisements /:id/show,但是当管理员登录时,URL将变为/ admin/advertisements /:id/show。尝试了很多方法,但找不到解决方案。 我的用户迁移文件如下:轨添加/管理员路由时,管理员日志中
class CreateUsers < ActiveRecord::Migration[5.1]
def change create_table :users do |t| t.string :first_name, limit: 15, null: false t.string :last_name, limit: 15 t.string :username, limit: 20 t.string :email, null: false t.string :password_digest t.boolean :approved, default: false t.boolean :admin, default: false t.timestamps end end end
我的广告迁移文件是:
class CreateAdvertisements < ActiveRecord::Migration[5.1]
def change
create_table :advertisements do |t|
t.string :name, null: false
t.text :description, null: false
t.integer :price, null: false
t.string :location, null: false
t.integer :user_id
t.boolean :approved, default: false
t.timestamps
end
add_index("advertisements", "user_id")
end
end
的路由文件(routes.rb中)具有代码
resources: users
resources: advertisements
有没有办法做到这一点?
要定义这样的路线,你可以你:
resources: advertisements
scope :admin
resources: advertisements
end
然后建立某种过滤器,这将迫使用户使用/advertisements
链接和力管理员用户/admin/advertisements
在advertisements_controller
:
before_action :require_proper_route_for_role, only: [:index, :new, :show, :edit]
private
def require_proper_route_for_role
request_params = "?#{params.to_query}"
if user.admin? && request.path !~ /^\/admin/
redirect_to "/admin#{request.path}#{request_params}"
elsif request.path =~ /^\/admin/ && !user.admin?
redirect_to "#{request.path.sub('/admin','')}#{request_params}"
end
end
此代码是不完美可言,但它是我能在有限的时间做最好...但是,正如我所说,我认为你正在做一些错误的事情,应该在一般
重新思考感谢您的帮助。除了与URL一起发送参数的URL之外,其他工作都很精美。 –
是的,你是对的。我没有考虑到它。但是在create/update/destroy中处理所有这些将会非常困难。你不能做重定向POST/PUT/DELETE – AntonTkachov
所以再次就是为什么你需要为同样的逻辑,不同路线的一个问题? – AntonTkachov
只是一个编辑,以“AntonTkachov的”的答案。代码在某些部分失败,因为request.path
丢弃了参数并刚刚获得相对路径,参数丢失。此外,'post','patch'和'put'方法正在变成阻止创建和更新新广告的'get'方法。一些小的变化,让我来纠正问题,如下:
before_action: :require_proper_route_for_role, except: [:create, :update]
private
def require_proper_route_for_role
url_path = request.url
params_path = url_path.split('?').last
if current_user.admin? && request.path !~ /^\/admin/
if params_path == url_path
redirect_to "/admin#{request.path}"
else
redirect_to "/admin#{request.path}?#{params_path}"
end
elsif request.path =~ /^\/admin/ && !current_user.admin?
redirect_to "#{request.path.sub('/admin','')}"
end
end
你想不同的途径导致单独的控制器或你想同一个控制器能与不同的路线访问? – AntonTkachov
我希望可以通过单独的路线访问相同的控制器,例如广告可能不得不由管理员或发布它的用户删除。 –
一方面是......但另一方面用户应该只能访问他自己的帖子,而管理员 - 所有帖子。我通常使用两种变体:1.设置单独的管理面板命名空间或2.使用相同的路由,但只隐藏没有管理员用户的管理员逻辑。你有什么理由拥有2个管理员的2条路线?管理员/非管理员角色可以在一条路线上轻松处理 – AntonTkachov