Rails - Как исправить созданный URL, чтобы он был дружественным URL - PullRequest
2 голосов
/ 28 апреля 2011

У меня есть модели, которые выглядят как

search.rb:
  id eg: 101
  name eg: San Francisco

cars.rb
  id
  name

Контроллер поиска перенаправляет пользователя на автомобили.

search_controller.rb
if search.search_type=='cars'
  redirect_to :controller=>'cars', :action=>'index', :id=>search
end

Запрос на поиск списка автомобилей из Сан-Франциско выглядит так:

http://localhost/cars?id=101

Я переопределил метод to_param в search.rb как:

search.rb
def to_param
  normalized_name = name.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '')
  "#{self.id}-#{normalized_name}"
end

Это работает в некоторой степени: Он генерирует URL, которые выглядят так:

http://localhost/cars?id=101-San-Francisco

Однако я хотел бы создать URL-адрес, похожий на

http://localhost/cars/San-Francisco

Как бы я поступил так? Я исправляю маршруты?

Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 28 апреля 2011

Это может быть сложно, если вы не готовы к этому. Как вы определили, метод, который управляет отображением модели в параметрах, довольно прост, но это только половина. Позже вам придется получить его, поэтому вам нужно настроить его:

class Search < ActiveRecord::Base
  before_save :assign_slug

  def self.from_param(id)
    self.find_by_slug(id)
  end

  def to_param
    self.slug
  end

protected
  def assign_slug
    self.slug = self.name.gsub(' ', '-').gsub(/[^\w\-\.]/, '')
  end
end

Для этого требуется добавить столбец slug в вашу модель поиска, чтобы можно было выполнить поиск по ней. Хорошей идеей может быть добавление индекса, возможно, уникального, для более эффективного извлечения их позже.

В вашем контроллере вы не используете find, а from_param вместо этого для поиска.

Вам также необходимо добавить собственный маршрут, который принимает этот параметр:

match '/cars/:search', :to => 'cars#index', :as => 'cars_search'

В качестве примечания вы должны по возможности использовать методы генератора маршрута, поскольку несколько маршрутов могут соответствовать одним и тем же параметрам. Например:

redirect_to cars_search_path(:search => search)
...