Ruby on rails Rails,设计:基于用户类型的相同资源、不同控制器

Ruby on rails Rails,设计:基于用户类型的相同资源、不同控制器,ruby-on-rails,devise,routes,Ruby On Rails,Devise,Routes,我有一个资源,比如说Product,它可以被两个不同的用户类访问:比如说Customer和Admin。这两者之间没有继承关系 我正在使用Desive进行身份验证: # config/routes.rb devises_for :customers deviser_for :admins 我有两个控制器: # app/controllers/customers/products_controller.rb class Customers::ProductsController < Ap

我有一个资源,比如说
Product
,它可以被两个不同的用户类访问:比如说
Customer
Admin
。这两者之间没有继承关系

我正在使用Desive进行身份验证:

# config/routes.rb

devises_for :customers
deviser_for :admins
我有两个控制器:

# app/controllers/customers/products_controller.rb

class Customers::ProductsController < ApplicationController
这不管用。当我以
客户
身份登录时,
产品路径
仍然指向
管理员::产品控制器#索引
,因为它是第一个定义的

有线索吗?如果没有黑客,我想做的可能根本不可能

更新
根据,这是不可行的。

为此,您需要覆盖现有的Desive方法。把这个放到你的
app/controllers/application\u controller.rb

def after_sign_in_path_for(resource)

      if resource.class == Admin   

          '/your/path/for/admins'

      elsif resource.class == Customer

        '/your/path/for/customers'

      end 
end
注意:如果要实现用户请求的
上一个\u url
,则可以如下使用:

  session[:previous_url] || 'your/path/for/admins'

事实证明,实现这一目标的最佳方法是使用布线约束:

# config/routes.rb

resources :products, module: 'customers', constraints: CustomersConstraint.new
resources :products, module: 'admins', constraints: AdminsConstraint.new


# app/helpers/customers_constraint.rb

class CustomersConstraint
  def matches? request
    !!request.env["warden"].user(:customer)
  end
end


# app/helpers/admins_constraint.rb

class AdminsConstraint
  def matches? request
    !!request.env["warden"].user(:admin)
  end
end
我将约束对象存储在helper文件夹中,因为我不知道放置它们的最佳位置


感谢您的提示。

谢谢您的回答,但我希望此技巧适用于所有
产品
相关路径,而不仅仅是登录后的路径。这就是为什么我要定义路由,也就是说,要处处避免条件逻辑。你到底想要什么?。。。我没有找到u。我希望
产品
资源上的所有CRUD路径操作都指向不同的控制器,具体取决于登录的用户类别。然后,你可以做一件事。。。在
产品控制器
中放置一个before过滤器,检查用户类型并相应地采取行动。我想在路由级别执行此操作,因此是范围。不同的用户类,不同的控制器。否则,
ProductController
将变成一个巨大的意大利面碗。
  session[:previous_url] || 'your/path/for/admins'
# config/routes.rb

resources :products, module: 'customers', constraints: CustomersConstraint.new
resources :products, module: 'admins', constraints: AdminsConstraint.new


# app/helpers/customers_constraint.rb

class CustomersConstraint
  def matches? request
    !!request.env["warden"].user(:customer)
  end
end


# app/helpers/admins_constraint.rb

class AdminsConstraint
  def matches? request
    !!request.env["warden"].user(:admin)
  end
end