<!DOCTYPE html>
<html lang="en-GB">
<head>
<meta charset="utf-8">
<style> body { white-space: pre-wrap; }
</style>
</head>
Стиль пробела: предварительная перенос будет отображать '\ n' как новые строки. Так работает HTML, с JavaScript это не проблема.
Имейте всеобъемлющий маршрут у основания routes.rb. Реализуйте любую логику поиска псевдонима, которую Вы хотите в действии, которые направляют, направляет Вас к.
В моей реализации у меня есть таблица, которая отображает определенные URL на контроллер, действие и хеш параметра. Я просто щипаю их из базы данных, затем называю соответствующие меры и затем пытаюсь представить шаблон по умолчанию для действия. Если действие уже представило что-то, которое бросает DoubleRenderError, который я ловлю и игнорирую.
Можно расширить эту технику, которая будет столь сложной, как Вы хотите, хотя, поскольку это становится более сложным, имеет больше смысла реализовывать его путем тонкой настройки или маршрутов или логики маршрутизации значения по умолчанию направляющих, а не путем важной перереализации всей логики маршрутизации сами.
Если Вы не находите псевдоним, можно бросить 404 или 500 ошибок, поскольку Вы считаете соответствующими.
Кэширование: Не знание Ваших URL априорно может сделать страницу, кэширующую абсолютный перенос. Помните, это кэшируется на основе предоставленного URI, НЕ на url_for (:action_you_actually_executed
). Это означает это, если Вы искажаете
/foo_action/bar_method
кому:
/some-wonderful-alias
Вы получите some-wonderful-alias.html, живущий в Вашем каталоге кэша. И когда Вы пытаетесь развернуть панель нечто, Вы не развернете тот файл, если Вы не укажете его явно.
Отказоустойчивость: Проверьте, чтобы удостовериться, что кто-то случайно не искажает по существующему маршруту. Можно сделать это тривиально путем принуждения всех псевдонимов в "каталог", который известен не иначе быть routable (в этом случае, при этом псевдоним дословно уникален, достаточно, чтобы удостовериться, что они никогда не сталкиваются), но это не максимально желательное решение для нескольких приложений, о которых я могу думать об этом.
Во-первых, как другие предположили, создайте всеобъемлющий маршрут у основания routes.rb:
map.connect ':name', :controller => 'aliases', :action => 'show'
Затем в AliasesController можно использовать render_component для рендеринга искаженного действия:
class AliasesController < ApplicationController
def show
if alias = Alias.find_by_name(params[:name])
render_component(:controller => alias.page_type.controller,
:action => alias.page_type.action,
:navigation_node_id => alias.navigation_node.id)
else
render :file => "#{RAILS_ROOT}/public/404.html", :status => :not_found
end
end
end
Я не уверен, что полностью понимаю вопрос, но Вы могли использовать method_missing
в Ваших контроллерах и затем поиске псевдоним, возможно, как это:
class MyController
def method_missing(sym, *args)
aliased = Alias.find_by_action_name(sym)
# sanity check here in case no alias
self.send( aliased.real_action_name )
# sanity check here in case the real action calls a different render explicitly
render :action => aliased.real_action_name
end
def normal_action
@thing = Things.find(params[:id])
end
end
Если бы Вы хотели оптимизировать это, то Вы могли бы поместить a define_method
в method_missing
, таким образом, это только 'отсутствовало' бы на первом вызове и будет нормальным методом с тех пор.