Ruby on rails Rails路由-动态选择控制器
为了回答这个问题,假设我有两种用户类型:type1和type2。我希望Rails根据显示的用户类型使用控制器/模块。例如: 如果Userid:1,则键入:“type1”具有type1,而Userid:2,则键入:“type2”具有type2,转到:Ruby on rails Rails路由-动态选择控制器,ruby-on-rails,ruby,routes,Ruby On Rails,Ruby,Routes,为了回答这个问题,假设我有两种用户类型:type1和type2。我希望Rails根据显示的用户类型使用控制器/模块。例如: 如果Userid:1,则键入:“type1”具有type1,而Userid:2,则键入:“type2”具有type2,转到: /users/1 /users/2 将选择Type1::UsersController。并前往: /users/1 /users/2 将选择Type2::UsersController 这将允许我为每种类型使用不同的控制器和视图 注意:我不希
/users/1
/users/2
将选择Type1::UsersController。并前往:
/users/1
/users/2
将选择Type2::UsersController
这将允许我为每种类型使用不同的控制器和视图
注意:我不希望该类型显示在URL中,我希望它是动态的。这是可能的,但您可能会做很多不必要的工作来对抗Rails方式。我想你会想要一个控制器,因为可能有相当多的共享逻辑,如保存、删除、创建等 要回答您的问题,因为我讨厌人们留下建议而不是答案,那么您需要创建一个扩展路由的模块,它将允许您进行自定义匹配。从那里,你可以做你的检查和适当的路线 也就是说,一个更好的方法是使用一个控制器,它有一个可以选择视图的集中式方法
def find_view view_name
"#{view_name}#{@user.type}"
end
因此,调用render find_view'new'将尝试呈现名为new-type1的视图。您可以将所有type1用户特定逻辑放在该视图中。用户类型2也一样
同样,由于我认为您的用户代码中会有很多重叠,您可能希望将这个find_view方法推送到一个helper类,这样您就可以从视图中调用它,并根据用户类型执行诸如渲染特定部分之类的操作。这将允许更多的代码重用,这从来都不是一件坏事
一旦你想拥有一个单一的控制器,有很多简单的方法可以将特定于用户类型的代码推送到不同的渠道-上面解释的视图方法,你可以将所有相关的代码推送到单独的助手,这些助手会根据用户类型动态调用,我相信还有更多更好的。但所有这些都有一个主要的共同点——如果你屈从于让Rails拥有一条路由,一个控制器,那么你与Rails的斗争就会少很多,重复代码也会少很多
祝你好运,希望这会有所帮助。正如GoGoCarl所说,这不是Rails真正的做事方式。这就是说,让它发挥作用并不难。您可以在routes.rb中执行类似操作: 在我的示例中,我将您的类型字段重命名为_类型,因为Rails使用类型进行单表继承。我已经测试过了,它可以正常工作。User.find:id可能在未测试的情况下工作。这看起来像是一个可能的黑客,我仍然需要测试它。谢谢你的帮助。User.find:id不起作用:我试过了,尽管它没有真正意义。