【问题标题】:How to replace routes for user model by role如何按角色替换用户模型的路由
【发布时间】:2016-11-11 10:08:37
【问题描述】:

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

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

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

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

【问题讨论】:

标签: ruby-on-rails


【解决方案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

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

【讨论】:

【解决方案2】:

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

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

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

[更新]

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多