2017-11-18 244 views
0

在我的项目我有一个用户模式和广告模式。用户模型也包含管理员。我想设置路由,以便管理员登录时,所有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 

有没有办法做到这一点?

+0

你想不同的途径导致单独的控制器或你想同一个控制器能与不同的路线访问? – AntonTkachov

+0

我希望可以通过单独的路线访问相同的控制器,例如广告可能不得不由管理员或发布它的用户删除。 –

+0

一方面是......但另一方面用户应该只能访问他自己的帖子,而管理员 - 所有帖子。我通常使用两种变体:1.设置单独的管理面板命名空间或2.使用相同的路由,但只隐藏没有管理员用户的管理员逻辑。你有什么理由拥有2个管理员的2条路线?管理员/非管理员角色可以在一条路线上轻松处理 – AntonTkachov

回答

0

要定义这样的路线,你可以你:

resources: advertisements 

scope :admin 
    resources: advertisements 
end 

然后建立某种过滤器,这将迫使用户使用/advertisements链接和力管理员用户/admin/advertisementsadvertisements_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 

此代码是不完美可言,但它是我能在有限的时间做最好...但是,正如我所说,我认为你正在做一些错误的事情,应该在一般

重新思考
+0

感谢您的帮助。除了与URL一起发送参数的URL之外,其他工作都很精美。 –

+0

是的,你是对的。我没有考虑到它。但是在create/update/destroy中处理所有这些将会非常困难。你不能做重定向POST/PUT/DELETE – AntonTkachov

+0

所以再次就是为什么你需要为同样的逻辑,不同路线的一个问题? – AntonTkachov

0

只是一个编辑,以“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