Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从Drupal迁移到Rails-路由_Ruby On Rails_Drupal_Routing_Http Status Code 404 - Fatal编程技术网

Ruby on rails 从Drupal迁移到Rails-路由

Ruby on rails 从Drupal迁移到Rails-路由,ruby-on-rails,drupal,routing,http-status-code-404,Ruby On Rails,Drupal,Routing,Http Status Code 404,我已经为我的组织开发了一个新的RubyonRails站点。我希望新的Rails站点能够拦截针对旧站点的传入请求,并为用户显示一条消息,指示新站点已启动,一个链接,一个他们最有可能尝试访问的新URL,以及一个更新书签的提醒 所以当谈到rails路由时,我是个新手,所以我想问你怎么做。有“铁路路”吗 以下是我迄今为止的想法 旧站点不使用干净的URL,因此每个请求都会转到默认路由,在新站点中,默认路由是带有查询字符串的主控制器。我在想,在控制器中,我可以测试是否设置了params[:q],然后根据q参

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

所以当谈到rails路由时,我是个新手,所以我想问你怎么做。有“铁路路”吗

以下是我迄今为止的想法

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

有没有更好的办法

我感谢你的任何意见


谢谢

URL是否有一致的更改方式?例如,q=pie变成了
/甜点/pie

如果没有,并且需要某种类型的手动数据库查询,则必须按照前面提到的方式进行。我将创建一个
重定向
操作,该操作捕获所有路径,使其与您的主/索引操作分离

此外,如果您关心SEO juice,请确保使用301重定向:

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


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

在负责主页的Rails控制器中(假设它是HomeController),在过滤器之前添加如下内容:

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

我关心的URL动态地从web服务加载内容,并且在查询字符串中传递相关资源的id。例如/?q=node12&ShowID=100会将您带到显示ID为100的节目的节目信息的页面。将上述资源映射到的新URL添加到上述注释中将是/Shows/100。资源的ID在两个站点之间保留创建。哈库宁举了一个更具体的例子。如果旧URL除了查询字符串之外还有一个路径(即/some/path?q=1),那么您必须在应用程序\u controller.rb中添加before\u过滤器。那么你甚至不用担心你的routes.rb会捕获旧的URL。谢谢。。。这很有效。很抱歉延迟了回复,在回到这里之前,我又谈到了一些其他问题。
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