Действительно ли это - плохая идея перезагрузить маршруты динамично в направляющих?

<!DOCTYPE html> 
<html lang="en-GB"> 
<head>
<meta charset="utf-8"> 
<style> body { white-space: pre-wrap; } 
</style> 
</head>

Стиль пробела: предварительная перенос будет отображать '\ n' как новые строки. Так работает HTML, с JavaScript это не проблема.

7
задан Ben Crouse 25 September 2008 в 12:39
поделиться

3 ответа

Быстрое решение

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

5
ответ дан 6 December 2019 в 10:55
поделиться

Во-первых, как другие предположили, создайте всеобъемлющий маршрут у основания 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
2
ответ дан 6 December 2019 в 10:55
поделиться

Я не уверен, что полностью понимаю вопрос, но Вы могли использовать 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, таким образом, это только 'отсутствовало' бы на первом вызове и будет нормальным методом с тех пор.

0
ответ дан 6 December 2019 в 10:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: