如何按角色替换用户模型的路由

时间:2016-11-11 10:08:37

标签: ruby-on-rails

我的模型用户包含列角色。

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

动作节目(个人资料):http://localhost:3000/users/1

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

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

2 个答案:

答案 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

这不是我想要的,但它应该创建一条路线,只有具有托运人或商店角色的用户才能访问。

答案 1 :(得分:-1)

如果您只想映射该路线,可以

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

这样您就可以使用User结构下的show controller处理该路由。然后,/shops/1的html仍应位于views/users/show下,因为rails将查找与控制器同名的视图以呈现页面。

[UPDATE]

然后,在您的控制器中,您可以说

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