设计:两个范围内资源的路径助手

时间:2015-09-08 08:04:10

标签: ruby-on-rails ruby devise

我试图实现以下目标:

我有两个应用程序入口点(/ 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

1 个答案:

答案 0 :(得分:0)

试试这个:

  scope '/admin', as: :admin do
    resources :customers
    root 'default#index', as: :authenticated_root
  end

/sales范围相同。

更新:哦,我现在看到了,你实际上并不想要2条不同的路径,而是根据current_user值提供不同值的通用助手。抱歉,路线不会以这种方式工作,它们会在应用程序启动时加载(所有这些!)(这就是为什么你不能删除"一些路线依赖在请求期间的约束上)并且首先从上到下匹配一个。

是的,您在EDIT部分中的解决方案是一种方法,但我更倾向于使用我的自定义帮助程序,因为否则对于您项目中的新手来说,为什么同样的url_helper会非常惊喜产生不同的网址,直到他最终绊倒你的重写帮助。