使用routes.rb重定向旧URL的Rails

时间:2010-12-27 19:56:46

标签: ruby-on-rails url routes

我有一个用Coldfusion构建的旧网站,这是一个用Rails构建的新网站。我想将旧网址重定向到新网址。我不确定路线是否可行(我是菜鸟)。这些网址非常相似。这应该很容易,但我不确定最好的方法。

旧网址:

mysite.com/this-is-the-slug-right-here/

新网址:

mysite.com/blog/this-is-the-slug-right-here

这是问题,我有3个“内容类型”。旧网站网址没有区分内容类型。新的Rails站点为每种内容类型都有一个控制器:博客,照片,移动照片。

因此,在上面的示例中,/blog/是控制器(内容类型),this-is-the-slug-right-here是内容的永久链接或slug。我得到的是这样的:

@content = Content.where(:permalink => params[:id]).first

我应该使用routes.rb,还是需要某种catch-all脚本?让我指出正确方向的任何帮助将不胜感激。


修改以进一步澄清

这是一篇博文:http://jyoseph.com/treadmill-desk-walk-this-way/

此新网址为/blog/treadmill-desk-walk-this-way,因为它是博客的内容类型。

照片信息:http://jyoseph.com/berries/

此新网址为/photos/berries,因为它是一种内容类型的照片。

内容类型是内容模型上的一个属性,存储在属性content_type中。


这是我的routes.rb文件:

resources :contents
match 'mophoblog/:id', :to => 'mophoblog#show'
match 'photos/:id', :to => 'photos#show'
match 'blog/:id', :to => 'blog#show'

root :to => "index#index"   
match ':controller(/:action(/:id(.:format)))'

知道了使用@mark的答案,这就是我最终的结果。

在我的routes.rb

match ':id' => 'contents#redirect',  :via => :get, :as => :id

在我的内容控制器中:

def redirect
  @content = Content.where(:permalink => params[:id]).first
  if @content.content_type.eql?('Photo')
    redirect_to "/photos/#{@content.permalink}", :status => :moved_permanently   
  elsif @content.content_type.eql?('Blog')
    redirect_to "/blog/#{@content.permalink}", :status => :moved_permanently   
  elsif @content.content_type.eql?('MoPhoBlog')   
    redirect_to "/mophoblog/#{@content.permalink}", :status => :moved_permanently   
  end
end 

我确信这可以改进,特别是我重定向的方式,但这完全解决了我的问题。

3 个答案:

答案 0 :(得分:4)

你不能使用routes.rb来做到这一点,但是设置路线,获取内容类型和重定向都很简单。

类似的东西:

routes.rb
match.resources :photos
match.resources :mobile_photos
match.resources :blog
#everything_else all resource and named routes before
match ':article_id' => 'articles#redirect',  :via => :get, :as => :article_redirect

#articles_controller.rb
def redirect
  @content = Content.find params[:id]
  if @content.content_type.eql?('photo')
    redirect_to photo_path(@content), :status => :moved_permanently
  elsif @content.content_type.eql?('mobile_photo')
    redirect_to mobile_photo_path(@content), :status => :moved_permanently
  ...
end

现在,当我写这篇文章时,你可能只想要一个控制器用于所有这些?

答案 1 :(得分:2)

只是认为人们可能会对解决方案感兴趣,以进行更一般的重定向:

redirector = lambda do |env|
  path = env['action_dispatch.request.path_parameters'][:path]
  redirect("/new-url-base#{path}").call(env)
end

match 'old-url-base:path' => redirector, :constraints => {:path => /.*/}

redirect()只返回一个返回重定向标题的简单机架应用,因此将其包装在lambda中可以让您更改它的参数。维护将它包装在一个对象中可能更好:

match 'old-url-base:path' => Redirector.new("new-url-base", :path), :constraints => {:path => /.*/}

答案 2 :(得分:1)

Rails 4及更高版本支持内置重定向:

http://guides.rubyonrails.org/routing.html#redirection