Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 设计:两个作用域内资源的路径帮助器_Ruby On Rails_Ruby_Devise - Fatal编程技术网

Ruby on rails 设计:两个作用域内资源的路径帮助器

Ruby on rails 设计:两个作用域内资源的路径帮助器,ruby-on-rails,ruby,devise,Ruby On Rails,Ruby,Devise,我正在努力实现以下目标: 我有两个应用程序入口点(/admin和/sales) 我已经生成了一个资源(railsgeneratescaffold),名为customers。管理员和销售用户将需要从两个路径访问此资源。例如/管理员/客户和/销售/客户 到目前为止,这是可行的,实际问题来了。虽然我是以销售用户的身份登录的,但是路径帮助程序(例如新客户路径)都指向/admin/* My routes.rb文件: authenticated :user, ->(u) { u.role == 'ad

我正在努力实现以下目标:

我有两个应用程序入口点(/admin和/sales) 我已经生成了一个资源(railsgeneratescaffold),名为
customers
。管理员和销售用户将需要从两个路径访问此资源。例如/管理员/客户和/销售/客户

到目前为止,这是可行的,实际问题来了。虽然我是以
销售
用户的身份登录的,但是路径帮助程序(例如
新客户路径
)都指向
/admin/*

My 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
我真的需要找到一个合适的解决方案,因为更新脚手架生成器生成的所有代码对我来说似乎不可行

对于每个作用域,必须有比不同的路径帮助程序更好的方法。我不想这样做(在每个生成的文件中):

我的印象是,当我以销售用户的身份登录时,管理路径甚至不会加载,但我刚开始使用Desive,所以我对它知之甚少

编辑:

我想我可以创建一个帮助器并覆盖rails提供的路径帮助器:

def customers_path
  if current_user.role == 'sales'
    sales_customers_path
  end
end
试试这个:

  scope '/admin', as: :admin do
    resources :customers
    root 'default#index', as: :authenticated_root
  end
对于
/sales
范围也是如此

更新:哦,我现在明白了,实际上您不需要两个不同的路径,而是需要根据
当前用户
值给出不同值的通用帮助器。很抱歉,路由不是这样工作的,它们在应用程序启动时被加载(全部!)(这就是为什么在请求过程中不能根据您的约束“删除”某些路由),并从上到下进行第一次匹配


是的,您在
EDIT
部分中的解决方案是一种方法,但我更愿意使用我的自定义帮助程序,因为否则,对于项目中的新来者来说,同一个url\u帮助程序为什么会生成不同的url,这将是一个巨大的惊喜,直到他最终找到您覆盖的帮助者。

虽然这会生成带前缀的路径帮助者
sales\u customers\u path
,但这并不能解决问题。现在我有两组路由帮助器,它们都与通过脚手架生成器生成资源时使用的帮助器不匹配。当我沿着我在“Edit:”下添加的方法的行覆盖路径辅助对象时,这将起作用。但为什么这是必要的呢?难道不可能在每个“已验证”命名空间中都有完全相同的路径帮助器吗?非常感谢您的更新。因此,您的建议不是重写路径帮助器,而是创建我自己的帮助器(方法),根据用户角色处理正确路径的“选择”。这意味着生成的每个文件都必须进行编辑。我认为这是最干净的解决办法。这会让你的系统更加清晰,这(当然在我看来)是编程中最重要的事情。是的,您将不得不更改许多文件,现在您知道脚手架是邪恶的:)它看起来像。;)所以一般来说:你会建议不要使用脚手架吗?作为所有的工具,它可以方便地使用知识。脚手架非常有用,尤其是在项目开始时,但是您需要关注生成的文件,因此如果您注意到大量重复,您需要积极地重构它。就个人而言,我很少在项目中间使用资源脚手架(它生成太多的文件),通常只针对迁移和控制器,我手动创建的所有其他内容。
  scope '/admin', as: :admin do
    resources :customers
    root 'default#index', as: :authenticated_root
  end