Создание дружественных рельсовых URL - PullRequest
3 голосов
/ 22 февраля 2011

У меня несколько иная проблема: SEO-дружественные URL.У меня есть PagesController, поэтому мои URL-адреса в настоящее время похожи (с использованием маршрутизации покоя):

/ pages / some-content-title

Это прекрасно работает, но есть иерархическая структура длястраниц, поэтому мне нужно следующее:

/ some-content-title маршрутизирует к / pages / some-content-title

Я также могу добиться этого, используя:

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

в моем route.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 части "pages /" URL.Чего хочет SEO-чувак (и вот где пример является ключевым):

/ insurance =>: controller => 'pages',: id => 'insurance' # но URL в адресной строкеis / insurance

/ insurance / car: controller => 'pages',: category => 'insurance',: id => 'car' #, но URL-адрес в адресной строке - / insurance / car

Есть ли для него общий способ получить свою любовь к Google, а для меня - сохранить маршруты в здравом уме?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 22 февраля 2011

Это трудно сделать, так как вы переопределяете параметры в зависимости от их присутствия (или отсутствия) в пути. Вы можете обработать глобальные параметры в контроллере, но тогда вы не получите нужный 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

и сохранит URL-адрес в браузере, который запрашивает ваш SEO-чувак.

0 голосов
/ 04 декабря 2012

Для этого есть драгоценный камень friendly_id.Смотрите его страницу github

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...