Пользовательский маршрут вместе с маршрутами ресурсов

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

Вот мои маршруты, с которыми я сейчас работаю.

resources :shows
match "shows/:country" => "shows#index"

Такие маршруты, как ресурсы, работают нормально, но не совпадают. Если я переверну их, маршрут совпадения будет работать нормально, а вот ресурсы: показывает - нет.

Должен ли я сделать это как маршрут с пространством имен? Я не совсем уверен, что мне делать. Я пытаюсь достичь примерно этого.

http://site.com/shows/canada

Это вернет все шоу Candian.

Любая помощь приветствуется.


person Buddy Lindsey    schedule 28.02.2011    source источник


Ответы (2)


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

resources :shows, :constraints => { :id => /[0-9]+/ }
match "shows/:country" => "shows#index", :constraints => { :country => /[a-z]+/ }

Обратите внимание, что обычно это делается с помощью параметра запроса get, например http://example.com/shows?country=canada, который уже будет переходить к вашему shows#index действию и для params[:country] установлено значение "canada".

person Andrew Marshall    schedule 28.02.2011
comment
Да, я понимаю, что обычно это следует делать через строку запроса, но мне нужно сделать это таким образом. Код работает так: он нарушает работу помощника edit_show_path, но не new_show_path. Это из-за ограничения: id строки ресурсов показывает? - person Buddy Lindsey; 28.02.2011
comment
Работает ли посещение пути редактирования вручную (например, /edit/1)? Или просто сломан помощник по созданию пути? - person Andrew Marshall; 28.02.2011
comment
Извините, я не знаю, как решить эту проблему, смешивание и сопоставление маршрутов RESTful и non-RESTful на самом деле не является соглашением, поэтому не совсем удивительно, что помощники пути путаются. Это не лучший вариант, но вы можете использовать url_for. Вы также можете запустить rake routes, чтобы увидеть, как Rails на самом деле интерпретирует ваши маршруты. - person Andrew Marshall; 28.02.2011
comment
Спасибо, я буду продолжать возиться с этим, чтобы посмотреть, не смогу ли я как-нибудь понять это. Если мне нужно, думаю, я всегда могу сделать это со строками запроса и просто настроить собственный файл .htaccess. - person Buddy Lindsey; 28.02.2011
comment
Это решение, в котором у меня просто был плохой код в других местах. У меня также были плохие тесты маршрутизации. Также нужно поработать над написанием более качественных тестов. Это была смесь плохого кода просмотра и плохих тестов. Когда я снял все это и начал все заново, все заработало. - person Buddy Lindsey; 28.02.2011

Возможно, вас укусит маршрут по умолчанию, который ожидает /{controller}/{action} и соответственно маршрутизирует. Попробуйте удалить маршрут по умолчанию. Вам нужно будет обязательно объявить все свои маршруты, но в результате вы получите более предсказуемый набор маршрутов для вашего приложения.

person BJ Safdie    schedule 28.02.2011
comment
Я думал о таком подходе, но хотел бы избежать его, если смогу. - person Buddy Lindsey; 28.02.2011