错综复杂的Rails 3路由配置 - 可以routes.rb访问初始化器的代码吗?

时间:2013-08-27 13:42:29

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

我正在转换一堆用php编写的登陆页面,以便将它们添加到我的基于RoR的站点(现在已经存在超过2年)。这些登录页面分为几个版本,但不幸的是,URL名称没有一致性。我的问题是我正在转换的php页面已经有很高的页面排名,因此我想保持他们的URL完全按照它的方式。

我不知道如何设置我的routes.rb以便example.com/*将始终转到我的主页;但是,当(* =='一个登陆页面的名称')Rails将路由到一个单独的控制器,其中一个特定的操作将根据初始化程序和参数哈希确定要呈现的页面,如上所述,URL与php-to-RoR转换之前的URL相同,即www.example.com/name_of_landing_page,而不是www.example.com/*controller_name*/name_of_landing_page。< / p>

我知道:path属性,如果传递一个空字符串(即resources :examples, :path => ''),则可以从路径中排除控制器名称,但这并不能解决整个问题。

我正在考虑编写一个初始化程序,它将保存所有相关登录页面的哈希值,并使用routes.rb中的约束来检查它,但我不确定这种实现方式是否可行以及如何进行关于它。一个代码示例将非常感激。

是否有某种类型的routes.rb语法可以让我这样做,或者更好的解决方案?

2 个答案:

答案 0 :(得分:0)

回答第一个问题:在routes.rb中,在do / end块内你实际上是在ActionDispatch::Routing::Mapper的上下文中,所以不,你不会。但是,在该块之后,您将回到应用程序的顶层,并且可以访问在初始化程序中初始化的任何变量,但是,该代码可能更适合用于application.rb。

你应该在routes.rb中做的唯一事情是定义路线。

您还可以处理机架中遗留页面的请求

def call(env)
  request = Rack::Request.new(env)
  return [200, {"Location" => request.url("http://www.example.com")} if request.host == "www.oldpage.com"
end

此处有更多信息:http://railscasts.com/episodes/222-rack-in-rails-3

答案 1 :(得分:0)

我不明白为什么涉及复杂的事情。设置这样的路线应该非常简单。

假设您有一个控制器来处理名为“PagesController”的静态页面

get 'name-of-one-of-the-landing-pages-a', to: 'pages#a'
get 'name-of-one-of-the-landing-pages-b', to: 'pages#b'

无需在路径中添加控制器名称。你可以控制所有这些。