谁能想到在Rails中创建智能或动态路由的方法?

时间:2011-06-20 11:33:38

标签: ruby-on-rails ruby-on-rails-3 routing

鉴于我有控制器:

  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"

可能?

3 个答案:

答案 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