【问题标题】:Migrating from Drupal to Rails - Routing从 Drupal 迁移到 Rails - 路由
【发布时间】:2010-12-23 14:22:01
【问题描述】:

我为我的组织开发了一个新的 Ruby on Rails 站点。我希望新的 Rails 站点拦截用于旧站点的传入请求,并向用户显示一条消息,指示新站点已启动,链接他们最有可能尝试访问的新 URL,并提醒更新书签。

所以我在 Rails 路由方面很绿色,所以我想问你会如何做到这一点。有“轨道方式”吗?

这是我目前的想法。

旧站点不使用干净的 url,因此每个请求都会转到默认路由,在新站点中是带有查询字符串的 home 控制器。我在想在控制器中我可以测试是否设置了params[:q],然后根据 q 参数是什么,搜索并呈现将用户引导至新链接的信息页面。如果 q 参数没有意义(我不关心捕获旧站点上的每个页面,只关心重要的页面)重定向到自定义 404 页面,通知用户该链接可能是针对旧站点的,并给出用户搜索页面。

任何想法,有没有更好的方法?

感谢任何意见。

谢谢

【问题讨论】:

    标签: ruby-on-rails drupal routing http-status-code-404


    【解决方案1】:

    在负责主页的 Rails 控制器(假设是 HomeController)中添加 before_filter,如下所示:

    class HomeController < ActionController::Base
      before_filter :handle_drupal_requests, :only => :index
    

    然后像这样添加处理程序方法本身handle_drupal_requests

    class HomeController < ActionController::Base
      before_filter :handle_drupal_requests, :only => :index
    
      # ... other code ...
    
    private
      def handle_drupal_requests
         if params[:q].present?
            flash[:notice] = "You're being redirected because blah."
            redirect_to convert_drupal_url(params[:q]), :status => 301
         end
      end
    
      def convert_drupal_url(query_string)
         # your logic for converting query string, for example:
         item, id = query_string.split('&').last.split('=')
         item_controller = item.underscore.split('_').first.pluralize
         {:controller => item_controller, :action => "show", :id => id}
      end
    end
    

    【讨论】:

    • 谢谢...这很好用。很抱歉延迟回复,我在回到这个问题之前先讨论了其他一些问题。
    【解决方案2】:

    网址更改的方式是否一致?比如/?q=pie变成/dessert/pie

    如果不是,并且它需要某种手动数据库查询,则必须按照您提到的方式进行。我会创建一个redirect 操作来捕获所有路径,以使其与您的 home/index 操作分开。

    另外,如果您关心 SEO,请务必使用 301 重定向:

    redirect_to dessert_url, :status=>301
    

    然后您必须进行即时重定向(没有中间页面显示“更新您的书签”)。我要做的是即时重定向,并放一条 flash[:notice] 消息说“请更新您的书签”。

    如果您需要更直接的示例,请发布一些 URL 示例。

    【讨论】:

    • 我关心的 URL 从 Web 服务动态加载内容,并且相关资源的 id 在查询字符串中传递。例如 /?q=node12&ShowID=100 会将您带到显示 ID 为 100 的节目的节目信息的页面。
    • 添加到上面的评论 上述资源将映射到的新 URL 将是 /shows/100 资源的 ID 在两个网站
    • 太棒了。 hakunin 举了一个更具体的例子。如果旧 URL 除了查询字符串之外还有路径(即 /some/path?q=1),则必须将 before_filter 放在 application_controller.rb 中。那么您甚至不必担心您的 routes.rb 会捕获旧 URL。
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    相关资源
    最近更新 更多