我试图实现以下目标:
我有两个应用程序入口点(/ admin和/ sales)
我已经生成了一个名为customers
的资源(rails generate scaffold)。管理员和销售用户需要从两个路由访问此资源。例如。 / admin / customers和/ sales / customers。
到目前为止,这是实际问题。虽然我以sales
用户身份登录,但路径助手(例如 new_customer_path
)都指向/admin/*
我的routes.rb文件:
authenticated :user, ->(u) { u.role == 'admin' } do
scope '/admin' do
resources :customers
root 'default#index', as: :admin_authenticated_root
end
end
authenticated :user, ->(u) { u.role.start_with? 'sales' } do
scope '/sales' do
resources :customers
root 'default#index', as: :sales_authenticated_root
end
end
有了这个,我最终得到了以下路线。
customers GET /admin/customers(.:format) customers#index
POST /admin/customers(.:format) customers#create
new_customer GET /admin/customers/new(.:format) customers#new
edit_customer GET /admin/customers/:id/edit(.:format) customers#edit
customer GET /admin/customers/:id(.:format) customers#show
PATCH /admin/customers/:id(.:format) customers#update
PUT /admin/customers/:id(.:format) customers#update
DELETE /admin/customers/:id(.:format) customers#destroy
GET /sales/customers(.:format) customers#index
POST /sales/customers(.:format) customers#create
GET /sales/customers/new(.:format) customers#new
GET /sales/customers/:id/edit(.:format) customers#edit
GET /sales/customers/:id(.:format) customers#show
PATCH /sales/customers/:id(.:format) customers#update
PUT /sales/customers/:id(.:format) customers#update
DELETE /sales/customers/:id(.:format) customers#destroy
我真的需要找到一个合适的解决方案,因为更新脚手架生成器生成的所有代码对我来说似乎不可行。
每个范围必须有比不同路径助手更好的方法。我不想做这样的事情(在每个生成的文件中):
`send("#{current_user.role}_customers_path")`
我的印象是,当我以销售用户身份登录时,甚至不会加载管理员路由,但我刚开始使用设计,所以我对它的知识很少
修改
我想我可以创建一个帮助器并覆盖rails提供的路径助手:
def customers_path
if current_user.role == 'sales'
sales_customers_path
end
end
答案 0 :(得分:0)
试试这个:
scope '/admin', as: :admin do
resources :customers
root 'default#index', as: :authenticated_root
end
和/sales
范围相同。
更新:哦,我现在看到了,你实际上并不想要2条不同的路径,而是根据current_user
值提供不同值的通用助手。抱歉,路线不会以这种方式工作,它们会在应用程序启动时加载(所有这些!)(这就是为什么你不能删除"一些路线依赖在请求期间的约束上)并且首先从上到下匹配一个。
是的,您在EDIT
部分中的解决方案是一种方法,但我更倾向于使用我的自定义帮助程序,因为否则对于您项目中的新手来说,为什么同样的url_helper会非常惊喜产生不同的网址,直到他最终绊倒你的重写帮助。