Маршруты и спецификации маршрутизации для остальных ресурсов с помощью пользовательских слагов - PullRequest
1 голос
/ 20 июля 2011

У меня есть модель Contact, к которой я хочу получить доступ через URL в URL, поэтому я переопределил to_param следующим образом:

def to_param
   "#{self.id}-#{full_name.parameterize}"
end

Я использую стандартные, спокойные ресурсы:

resources :contact

Это работает как ожидалось. Помощники пути возвращают зашифрованные URL-адреса. И URL-адреса правильно направляются на контроллер. Пока все хорошо.

Проблема в том, что хотя слаг направлен правильно, обновление спецификаций маршрутизации для отражения изменений приводит к сбою спецификаций.

например. эта спецификация не работает:

get("/contacts/1-john-smith").should route_to("contacts#show", :id => "1")

Оригинальная версия проходит:

get("/contacts/1").should route_to("contacts#show", :id => "1")

Что-то здесь не совсем складывается. Почему спецификация не работает, когда URL-адрес разрешается правильно в браузере? И почему изменение to_param не нарушает первоначальный URL?

Что более важно, как я могу изменить объявление маршрутизации, чтобы спецификация прошла? Могу ли я сделать это с помощью декларации resources? или я должен определить эти маршруты вручную?

1 Ответ

1 голос
/ 20 июля 2011

В вашем get вы передаете id из "1-john-smith", поэтому ваш контроллер получит его. Измените свою спецификацию на это:

get("/contacts/1-john-smith").should route_to("contacts#show",
    :id => "1-john-smith")

Код маршрутизации безразличен к добавленной вами функции slug, и он не будет знать, как удалить некоторые части параметра id. Магия в основном в ActiveRecord::Base#find, потому что это:

Contacts.find "1-john-smith"

работает так же, как это:

Contacts.find "1"
...