gpt4 book ai didi

ruby-on-rails - 创建友好的 Rails URL

转载 作者:行者123 更新时间:2023-12-04 06:16:55 25 4
gpt4 key购买 nike

我对一个相当普遍的问题的看法略有不同:对 SEO 友好的 URL。我有一个 PagesController,所以我的 URL 目前是这样的(使用 restful 路由):

/pages/some-content-title

这工作得很好,但是页面有层次结构,所以我需要以下内容:

/some-content-title 路由到/pages/some-content-title

我也可以通过以下方式实现这一点:

match '*a', :to => 'errors#routing'

在我的 routes.rb 中并将其捕获在 ErrorsController 中:

class ErrorsController < ApplicationController
def routing
Rails.logger.debug "routing error caught looking up #{params[:a]}"
if p = Page.find_by_slug(params[:a])
redirect_to(:controller => 'pages', :action => 'show', :id => p)
return
end
render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
end
end

我的问题来自所需的 SEO 删除 URL 的“pages/”部分。 SEO 花花公子想要什么(这里是示例的关键所在):

/insurance => :controller=>'pages', :id=>'insurance' # 但是地址栏的url是/insurance

/insurance/car :controller=>'pages', :category=>'insurance', :id=>'car' # 但是地址栏中的url是/insurance/car

是否有一种通用方法可以让他获得他对 Google 的喜爱并让我保持路线的正常运行?

谢谢!

最佳答案

这很难做到,因为您要根据参数在路径中的存在(或不存在)重新定义参数。您可以在 Controller 中处理 globbed 参数,但是您得不到所需的 URL,它需要重定向。

Rails 3 允许您在创建路由时使用 Rack 应用程序作为端点。这个(遗憾的是未被充分利用的)特性有可能使路由非常灵活。例如:

class SeoDispatcher
AD_KEY = "action_dispatch.request.path_parameters"

def self.call(env)
seopath = env[AD_KEY][:seopath]
if seopath
param1, param2 = seopath.split("/") # TODO handle paths with 3+ elements
if param2.nil?
env[AD_KEY][:id] = param1
else
env[AD_KEY][:category] = param1
env[AD_KEY][:id] = param2
end
end
PagesController.action(:show).call(env)
# TODO error handling for invalid paths
end
end
#

MyApp::Application.routes.draw do
match '*seopath' => SeoDispatcher
end

将映射如下:

GET '/insurance'     => PagesController#show, :id => 'insurance'
GET '/insurance/car' => PagesController#show, :id => 'car', :category => 'insurance

并将在浏览器中保留您的 SEO 人员要求的 URL。

关于ruby-on-rails - 创建友好的 Rails URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5071732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com