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