Добавьте следующее к нижней части вашего config/routes.rb
map.connect '*url', :controller => 'acts', :action => 'show_page'
Затем определите следующее в app/controllers/acts_controller.rb
def show_page
url = params[:url]
if Array === url
url = url.join('/')
else
url = url.to_s
end
# you now have the path in url
@act = Acts.find_by_name(url)
if @act
render :action => :show
else
redirect_to some_error_page, :status => 404
end
end
Несколько ошибок с вышеуказанным подходом.
- Маршрут поймать всех. Вы будете ловить все, что не соответствует маршруту над ним. Поэтому убедитесь, что он последний, и убедитесь, что вы готовы справиться с 404-ми и тому подобным.
- Параметр
:url
- это массив или строка в зависимости от входящего маршрута. Например, /blacktie/night
будет массивом со значением ['blacktie', 'night']
. Вот почему я присоединился к ним в начале show_page. Таким образом, ваша find_by_name
функция может быть действительно умной и учитывать вложенные действия и тому подобное.
Надеюсь, это поможет.
OR ...
Добавьте это к маршрутам (внизу):
map.connect ':name', :controller => "acts", :action => "show_page",
:requirements => {:name => /[\w|-]*/}
Это говорит рельсам отправлять что-либо, соответствующее требованиям вашему обработчику. Таким образом, ваша show_page будет выглядеть следующим образом:
def show_page
@act = Acts.find_by_name(params[:name])
if @act
render :action => :show
else
redirect_to some_error_page, :status => 404
end
end
Это избавляет от некоторых ошибок, но дает вам меньше возможностей для вложения и тому подобное.