Rails3: правильное использование маршрутизации и ресурсов - PullRequest
4 голосов
/ 14 ноября 2010

Я недавно присоединился к миру разработки приложений на Rails (Rails3) и могу злоупотреблять ресурсоемкой маршрутизацией.

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 14 ноября 2010

Вот еще один более простой. Просто добавьте общий маршрут в конец вашего routes.rb

match ":controller/:action"

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

get ":controller/:action", :constraints => { :controller => /home|help/ }
1 голос
/ 14 ноября 2010

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

# 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 обрабатывается только при запуске сервера, поэтому вам придется перезапустить сервер после добавления новых действий.

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