2010-11-14 2 views
4

Недавно я присоединился к миру разработки приложений Rails (Rails3), и я могу злоупотреблять находчивой маршрутизацией.Rails3: Соответствующее использование маршрутизации и ресурсов

Настраиваемая маршрутизация по умолчанию делает некоторые действительно удобные вспомогательные методы для URL-адресов, которые я использую постоянно. Моя проблема в том, что у меня есть контроллеры, которые я задал маршрутизацию как находчивый, просто чтобы воспользоваться этими вспомогательными методами. У меня есть базовая навигация по сайту, которая не имеет никакого отношения к ресурсам.

resource :home do 
    member do 
    get 'main' 
    get 'about' 
    get 'login' 
    get 'help' 
    end 
end 

Есть ли лучший способ сделать то, что я делаю? Все, что не требует, чтобы я вручную добавлял записи маршрутизации каждый раз, когда у меня есть новое действие контроллера?

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

match 'home/about' => 'home#about' 

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

+0

Может быть, я недопонимание вас, но это звучит так, как будто вы хотите, чтобы он автоматически искать через контроллер для общественности методы и создать для них именованные маршруты. Правильно ли я это читаю? Если это так, похоже, вы просите о волшебстве, которое даже Rails не может предоставить. –

+0

Нет, думаю, у вас все в порядке. Чтобы сделать пример, строка, подобная «match»: controller (/: action) », автоматически обнаруживает действия контроллера и генерирует именованные маршруты. Я все еще понимаю, какие уловки доступны. С другой стороны, я бы не возражал против того, что кто-то рекомендовал лучший подход или дал некоторые примеры того, как они обычно это делают для своих приложений. –

ответ

1

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

# routes.rb 
HomeController.public_instance_methods(false).select{|m| !(m.to_s =~ /^_/)}.each do |m| 
    match "home/#{m}", :action => m, :controller => HomeController, :as => "home_#{m}" 
end 

Это будет принимать явные (Ненаследуемые) публичные методы, например, от контроллера и выберите те, которые не начинаются с символом подчеркивания (потому что подчеркнутые те генерируются методы фильтров, остальные являются действительными действиями). Затем он будет генерировать именованный маршрут для каждого.

Имейте в виду, что routes.rb обрабатывается только при запуске сервера, поэтому после добавления новых действий вам придется перезагрузить сервер.

+0

Вот что я сейчас изучал. Чтобы не нажимать на вас дальше, но как это можно сделать более общим образом, чтобы я мог передать ему любое имя контроллера? Например (при условии, что он вызывает метод, который вы определили), generate_named_routes: home. Я пытался выяснить, был ли еще код в Rails, который может взять: домой и превратить его в HomeController. Тогда было бы просто иметь обобщенный метод для генерации именованных маршрутов. –

+0

Попробуйте '' # {my_symbol.to_s.classify} Контроллер ".constantize', чтобы преобразовать символ в соответствующий класс контроллера. вы можете поместить этот класс в переменную и использовать его вместо прямого указания контроллера, как указано выше. – edgerunner

+0

Спасибо за направление! Я сделал это, но, чтобы добавить к моей истории, у меня был один ужасный надзор. Это зависит от метода действия, присутствующего на контроллере. В некоторых случаях у меня есть представление, которое не имеет никакого метода действий, определенного для него ... Я возвращаюсь к авто-отображению представлений Rails. Если бы я хотел принять это дальше, мне нужно было бы немного понюхать взгляды, методы действий и т. Д. Могут ли черви. Внезапно легко использовать «match» home/about '. Еще раз спасибо! –

2

Вот еще один простой вариант. Просто добавьте общий маршрут в нижней части routes.rb

match ":controller/:action" 

и непосредственно сопоставляется с указанным действием указанного контроллера. Если хотите, вы можете быть более конкретным. Например, с помощью get вместо match ограничиться HTTP GET запросов, с указанием контроллеров applicaple и т.д.

get ":controller/:action", :constraints => { :controller => /home|help/ } 
Смежные вопросы