如何使用路由将旧网址重定向到rails中的新网址?

时间:2017-04-29 18:23:01

标签: ruby-on-rails

我的应用程序的旧站点地图现已被编入索引。对于一些用旧网址访问我的rails应用程序的人不应该去404。 旧网址看起来像这样

/search?sub_category=210

现在让他们友好之后,它看起来像这样:

/search?sub_category=milling-and-drilling

我尝试从控制器重定向它,但它在其他方面引起了太多问题。例如使用相同params的过滤器。有没有办法从路线文件中做到这一点?

2 个答案:

答案 0 :(得分:0)

您可以执行redirect_to route_path(id)

,而不是使用redirect_to route_path(object.find_by_id(id).name)

答案 1 :(得分:0)

  

如何使用路由将旧网址重定向到rails中的新网址?

AFAIK(据我所知),没有。 (如果通过参数)

routes.rb的主要工作是确定哪些“代码”将处理请求,特别是匹配request.urlrequest.method的请求。它还不涉及请求参数及其值:这些将在控制器本身中处理。虽然,您可以通过routes constraint

基于参数(或有关“请求”的任何信息)进行路由

替代解决方案:

现在可以通过“Slug名称或ID”找到,而不是通过ID查找。 在您的模型中,特别是在您的特定示例中,添加如下内容:

class SubCategory < ApplicationRecord

  # if you're using a gem for the "friendly" urls, you don't need this method, and just use theirs.
  def self.friendly_find!(friendly_id)
    # this may not necessarily be `name`, maybe `slug`? or depending on your case
    find_by(name: friendly_id) || find(friendly_id)
  end
end

在你的控制器中,只需替换你找到记录的地方(也可以根据需要替换其他模型而不只是SubCategory),特别是在search动作中:

def search
  sub_category = SubCategory.friendly_find!(params[:sub_category])
end

注意:如果未找到记录,friendly_find!将引发错误。