Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.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 Rails路由-动态选择控制器_Ruby On Rails_Ruby_Routes - Fatal编程技术网

Ruby on rails Rails路由-动态选择控制器

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 这将允许我为每种类型使用不同的控制器和视图 注意:我不希

为了回答这个问题,假设我有两种用户类型:type1和type2。我希望Rails根据显示的用户类型使用控制器/模块。例如:

如果Userid:1,则键入:“type1”具有type1,而Userid:2,则键入:“type2”具有type2,转到:

/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不起作用:我试过了,尽管它没有真正意义。