2016-11-11 66 views
0

我有模型用户包含列角色。如何用角色替换用户模型的路由

class CreateUsers < ActiveRecord::Migration[5.0] 
    def change 
    create_table :users do |t| 
     t.string :name 
     t.string :email 
     t.string :address 
     t.integer :role 
     t.timestamps 
    end 
    end 
end 

作用店如果User.role = 1,作用是托运人User.role = 0

的routes.rb

resources :users 

和URL的行动显示(配置文件):http://localhost:3000/users/1

我想改变它:角色。例如: http://localhost:3000/shops/1(如果User.role = 1) 或.../shippers/1(如果User.role = 0)。

我不知道该怎么做。帮帮我,谢谢!

+1

[Rails Routes based on condition]的可能重复(http://stackoverflow.com/questions/11230130/rails-routes-based-on-condition) – Pavan

+0

http://bjedrocha.com/rails/2015/03/18/role-based-routing-in-rails /请尝试这个我认为这可以帮助你 –

回答

0

如果你只是想映射这条路线,你可以做

match '/shops/1', to: 'users#show' 
match '/shippers/1', to: 'users#show' 

这样,你正在处理与用户结构下的显示控制器,这条路线。然后,/shops/1的html应该仍然在views/users/show之下,因为rails会查找与控制器同名的视图来呈现页面。

[更新]

然后,在你的控制器,你可以说

<% if User.role == 1 %> 
    <%redirect_to show_user_path%> 
+0

看到我上面更新的评论^^^ –

1

首先,你最好在你的模型中使用的enum。通过这种方式,您可以分配的实际作用到User.role属性(不仅仅是整数):

#app/models/user.rb 
class User < ActiveRecord::Base 
    enum role: [:shipper, :shop] 
end 

这仍然将保持在数据库中integer,但分配实际名称中的ActiveRecord的作用。例如,您将获得user.shipper?user.shop?


因为我很感兴趣,看到一个决定,我上网看了一下,发现this

它解释了我的想法 - 您需要使用约束来验证用户的角色并进行相应的重定向。这样,您可以使用单个路由帮助程序,并根据用户的角色将用户发送到不同的路由。

this answer,我想尝试这样的:

# lib/role_constraint.rb 
class RoleConstraint 
    def initialize(*roles) 
    @roles = roles 
    @role = request.env['warden'].user.try(:role) 
    end 

    def matches?(request) 
    params = request.path_parameters 
    @roles.include?(@role) && @role == params[:role] 
    end 
end 


#config/routes.rb 
resources :users, path: "", except: :show do 
    get ":role/:id", action: :show, on: :collection, constraints: RoleConstraint.new([:shipper, :shop]) 
end 

这不正是我想要的,但它应该建立一个单一的路线,这是只有一个角色的用户访问作为托运人或商店。

+0

它显示:“未初始化的常量RoleConstraint”? –

+0

您需要将lib目录添加到自动加载路径中http://stackoverflow.com/a/19650564/1143732 –