鉴于我有控制器:
app/controllers/app1/users_controller.rb app/controllers/app2/users_controller.rb
我的路线文件中有:
["app1", "app2"].each do |n| constraints(:host => "#{n}.com") do scope({:as => vn, :module => vn}) do resources :users end end end
这给了我这样的路线:
GET app1_users_path (app1.com/users) { :controller => "app1/users", :action => "index" } GET app2_users_path (app2.com/users) { :controller => "app2/users", :action => "index" }
我为每个路径执行此操作,对于我的应用程序中的每个“app”。
问题在于,不是。应用程序和路径都增长了,no也是如此。路径
n = no_of_paths a = no_of_apps (n * a) = "LOADS"
任何人都可以想到一种方法我可以将路由的“模块”部分(控制器前缀)设置为通配符,所以我只需要为每条路由命名一次吗?
类似的东西:
match ":controller/:action(/:id)" => ":host/:controller#:action"
可能?
答案 0 :(得分:0)
就是这样;它被称为全能路线。查看更多here。但是你应该注意到,不到一个星期前,关于全能路线的讨论很多,你可以阅读here。
请注意下面的引用引用了由Ryan Bigg (aka Radar)制作的Rails 3.1。
config / routes.rb底部的catch-all路由现在被注释掉了,因为默认情况下 不仅没有必要,而且非常危险。如果该链接存在,那么我将能够给你一个无辜的URL(例如bit.ly提供的URL)链接到/ admin / users / 1 / destroy,或者其他什么。你能在这看到问题吗?通过此注释,只有您明确定义的路线才可用。大多数应用程序无论如何都不需要全能。
答案 1 :(得分:0)
您是否有理由想要多个users_controller?就目前而言,似乎每个应用程序都有一个嵌套的用户资源。这意味着您应该能够拥有如下所示的网址/路由:
GET /app/1
这与您从脚手架生成器获得的“显示”控制器非常相似。这对应于数据库中id为1的应用程序(您可能希望散列id而不是直接id来防止篡改)。从控制器中的这里开始,您可以执行以下操作来提取与该应用程序对应的所有用户(假设您已设置关联)。
@users = Users.find_all_by_app_id(params[:id])
然后你可以在视图中处理它们。
答案 2 :(得分:0)
我已经解决了这个......
基本上,我问的是错误的问题。
我的应用程序提供多个网站,所以我认为为每个“垂直”(我的应用程序中的网站)创建一个控制器(以及一条路线)是明智的。
这些控制器中的共享行为进入了我在每个控制器中包含的模块。即:
# vertical1/users_controller.rb
class Vertical1::UsersController < ApplicationController
include UsersControllerTemplate
end
# vertical2/users_controller.rb
class Vertical2::UsersController < ApplicationController
include UsersControllerTemplate
end
# lib/users_controller_template.rb
module UsersContrllerTemplate
def index() end
end
在实践中,我发现95%的时间我坚持共享行为。 拥有单独的控制器和路线是过度的。
现在工作正常(并且更快),大多数控制器都有一个实例,而我需要自定义一个或两个名称间隔的控制器。
我还决定从默认行为(而不是包含模块)继承自定义控制器:
# vertical1/users_controller.rb
class Vertical1::UsersController < UsersController
# change some stuff here
end