我的模型用户包含列角色。
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)。
我不知道该怎么做。请帮帮我,谢谢!
答案 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%>