2013-02-18 2 views
1

У меня есть набор страниц с общедоступным атрибутом. Я хочу, чтобы файл маршрутов обрабатывал динамические маршруты, но только для общедоступных страниц.Динамические маршруты в рельсах с условием

В настоящее время у меня есть следующее, но ограничений нет, все страницы видны. То, что я хотел, это зайти на страницу, только если страница общественности еще поднять 404.

Page.public.each do |page| 
    get "/:slug", controller: 'pages', action: 'show' if page.public? 
end 

ответ

0

Рабочий код (не хватает 'Not Found')

class PagesController 

    before_filter :is_public, only => [:show] 

    protected 

    # Check if the page is public, otherwise raise a routing error. 
    def is_public 
    raise ActionController::RoutingError.new('Not Found') unless Page.find(params[:slug]).public? 
    end 
end 
2

Я бы поставил это поведение в контроллере, а не в routes.rb, так как страница может меняться от частного к общественности во время время выполнения и маршруты в производстве инициализируются только один раз в начале.

class PagesController 

    before_filter :is_public, only => [:show] 

    protected 

    # Check if the page is public, otherwise raise a routing error. 
    def is_public 
     raise ActionController::RoutingError.new unless Page.find(params[:slug]).public? 
    end 
end 
+0

Хороший вопрос. В декларации текущих маршрутов изменений не требуется? – olimart

+0

В текущем объявлении будет создан маршрут '/: slug' для каждого объекта страницы, поэтому я бы заменил его просто 'get '/: slug', controller: 'pages', action: 'show''. Или просто 'get '/: slug' => 'pages # show''. Я предполагаю, что параметр slug - это какое-то параметризированное уникальное имя, которое идентифицирует страницу при указании на page.find – roo

+0

Это вызывает ошибку в контроллере в is_public метод неправильное количество аргументов (0 для 1) – olimart