我有一个用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
我确信这可以改进,特别是我重定向的方式,但这完全解决了我的问题。
答案 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及更高版本支持内置重定向: