Как определить класс контроллера по заданной строке URL - PullRequest
6 голосов
/ 29 июня 2009

В рамках контроллера Rails или представления: Как я могу запросить механизм маршрутизации Rails, чтобы превратить относительную строку URL (например, "/ controllername / action / what" в класс контроллера, который будет отвечать за обработку этого запроса?

Я хочу сделать что-то вроде этого:

controllerClass = someMethod("/controllername/action/whatever")

Где contorllerClass является экземпляром класса.

Я не хочу делать никаких предположений относительно соглашения о маршрутизации, например. что «имя контроллера» в приведенном выше примере всегда является именем контроллера (потому что это не так).

Ответы [ 3 ]

12 голосов
/ 29 июня 2009

Здание от Карлоса там:

path = "/controllername/action/whatever"
c_name = ActionController::Routing::Routes.recognize_path(path)[:controller]
controllerClass = "#{c_name}_controller".camelize.constantize.new

даст вам новый экземпляр класса контроллера.

1 голос
/ 29 июня 2009

ActionController::Routing::Routes.recognize_path "/your/path/here"

будет печатать:

{:controller=>"corresponding_controller", :action=>"corresponding_action" } # Plus any params if they are passed

0 голосов
/ 29 июня 2009

Я не знаю, есть ли лучший способ сделать это, но я бы попробовал взглянуть на собственный код Rails.

У классов маршрутизации есть несколько методов утверждения, используемых при тестировании. Они получают путь и ожидаемый контроллер и утверждают, что он правильно маршрутизирует.

Взгляд туда должен дать вам хорошее начало.

http://api.rubyonrails.org/classes/ActionController/Assertions/RoutingAssertions.html#M000598

Специально эта строка

generated_path, extra_keys = ActionController::Routing::Routes.generate_extras(options, defaults)

Надеюсь, это поможет.

Edit:

Похоже, я указал вам на противоположный пример.

Вы хотите path => Контроллер / Действие

Тогда вы должны посмотреть на

http://api.rubyonrails.org/classes/ActionController/Assertions/RoutingAssertions.html#M000597

Так или иначе, я думаю, вы можете найти свое решение по этим направлениям:)

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