Хорошая новость заключается в том, что в Rails 3 все еще есть возможность настраивать произвольные / сокращенные помощники по URL.Вместо параметра для метода resources вы можете создавать сокращенные помощники url с объявлением match
в routs.rb.
Скажем, у нас настроены маршруты следующим образом (отмечая, что вам необходимо поддерживать 3 уровня вложенности):
resources :sites do
resources :groups, :controller => :url_groups do
member do
post :clone
end
resources :test_runs do
collection do
get :latest
end
end
end
end
Мы получаем все стандартные помощники по URL (rake routes
):
clone_site_group POST /sites/:site_id/groups/:id/clone(.:format) {:action=>"clone", :controller=>"url_groups"}
latest_site_group_test_runs GET /sites/:site_id/groups/:group_id/test_runs/latest(.:format) {:action=>"latest", :controller=>"test_runs"}
site_group_test_runs GET /sites/:site_id/groups/:group_id/test_runs(.:format) {:action=>"index", :controller=>"test_runs"}
(etc)
Но чтобы создать что-то более короткое, чем latest_site_group_test_runs_path(site,group)
, добавьте объявление о совпадении в route.rb следующим образом:
match 'sites/:site_id/groups/:id/test_runs/latest' => 'test_runs#latest', :as => :latest_tests
Теперь вы можете использовать latest_tests_path (site, group) или latest_tests_url(сайт, группа) для генерации полностью вложенного пути.
Если ваша цель - краткость, вы также можете использовать неявные полиморфные пути (при условии, что все ваши модели выровнены с путями ресурсов).
Например, учитывая @site # 1 и @group # 1, все последующее теперь сгенерирует один и тот же путь '/sites/1/groups/1/test_runs/latest'
:
= link_to "latest tests", latest_site_group_test_runs_path(@site,@group) # std helper
= link_to "latest tests", latest_tests_path(@site,@group) # match helper
= link_to "latest tests", [:latest,@site,@group,:test_runs] # implicit polymorphic path
Надеюсь, это поможет!Похоже, вы должны быть в состоянии получить гибкость, необходимую для переноса приложения.
Примечание: я закрыл глаза на скрытую проблему наличия модели под названием «Тест», поскольку это не по теме ;-)Вот несколько названий моделей, которые являются источником постоянной боли из-за конфликтов пространства имен и ключевых слов.Мой другой фаворит - это когда я действительно хотел иметь режим под названием «Case» (поскольку он лучше всего соответствовал проблемной области. Плохая идея, быстро меняющаяся!)