Исключая имена методов при проверке слагов в Ruby on Rails? - PullRequest
1 голос
/ 24 октября 2011

Интересно, как я могу проверить слаг (из пользовательского ввода) по всем именам методов контроллера (не обязательно те, что в self), кроме жесткого кода, так что tag/tomato допустимо, но /tag/allнет, потому что есть метод all в контроллере Tag?Используя рефлексию?

Или есть лучшая практика?

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

Похоже, вы действительно хотите защитить от конфликтов маршрутизации, и это только слабо связано с именами методов в вашем контроллере.

Вы можете получить все маршруты во время выполнения от

Rails.application.routes.routes

Это дает вам массив из ActionDispatch::Routing::Route экземпляров. Затем, чтобы получить маршруты GET:

gettable = Rails.application.routes.routes.select do |r|
    r.verb == 'GET' || r.verb == '' # Watch out for "no verb" -> "all verbs"
end

и оттуда вы можете извлечь пути и проверить, что ваш тег не соответствует ни одному из них:

paths = Rails.application.routes.routes.
        select { |r| r.verb == 'GET' || r.verb == '' }.
        map    { |r| r.path                          }

В результате вы получите список путей стиля /this/:that(.:format) в paths.

Как только все это будет выполнено, вы захотите, чтобы инициализатор приложения проверил, что вы не добавили в пространство имен /tag/ никаких маршрутов, которые соответствуют текущему состоянию базы данных тегов; в противном случае конфликты могут закрасться во время разработки.

Это должно убедить вас в том, что вам лучше хранить обычные маршруты для создания, просмотра и т. Д. В отдельном пространстве имен от ваших /tag/pancakes удобных для человека / SEO маршрутов. Вы можете оставить обычные в /tag, но переместить дружественных в /taxonomy/, /category/ или что-то подобное.

1 голос
/ 24 октября 2011

Вы можете получить список методов, определенных в вашем контроллере, следующим образом:

TagController.instance_methods(false)

Обратите внимание, что, передав false в качестве аргумента instance_methods, вы получите список методов, которые не наследуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...