rails_3_question: as => почему моя / posts / новая маршрутизация на posts / show после настройки слаг - PullRequest
2 голосов
/ 23 марта 2012

Я использую Rails 3 и после настройки слагов я обнаружил, что posts / new больше не работает.

posts/:id, posts/:id/edit и все другие операции CRUD работают.

Однако /posts/new выдает мне ошибку маршрутизации

Не найдено ни одного маршрута {: action => "show",: controller => "posts"}

Сейчаспо какой-то причине posts/new направляется к posts#show.В моих маршрутах это просто

resources :posts

Моя теория состоит в том, что, поскольку /posts/:slug теперь сопоставляется с вещами, отличными от числовых идентификаторов, глагол show направляется первым.Однако это не имеет смысла, поскольку posts/grr несуществующая запись выдает ошибку, отличную от posts/new, и posts/first прекрасно работает, а все связанные с ней пути также работают нормально.

Кто-нибудь знает, что может происходить?

Я загрузил репозиторий на https://github.com/cultofmetatron/cassowary/tree/photogallary

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

1 Ответ

0 голосов
/ 23 марта 2012

В вашем комментарии первая часть выглядит нормально: добавьте столбец к столбцу «Публикация» с именем slug и т. Д., И его содержимое станет частью или полностью URL-адреса, используемого для отображения определенного сообщения.(Я предполагаю, что другие операции CRUD должны работать как обычно)

Чтобы найти URL, маршрутизатор должен знать, как узнать, какой контроллер и действие будет обрабатывать этот URL (по сравнению с другими).Обычный маршрут resources :posts будет соответствовать всем методам RESTful, например, отображение запроса GET на путь, начинающийся с имени контроллера, и, если указан идентификатор (/posts/1), сопоставляется с методом контроллера posts#show, если нет, он будет соответствовать методу posts#index.Если запрос представляет собой PUT, или DELETE, или POST, произойдут различные действия в отношении стандартного формата URL.

Требуются два изменения:

  1. URL с форматом post slug должен:сопоставьте с методом posts#show (который изменяется соответствующим образом) и
  2. Любые ссылки на страницу show, созданные на вашем сайте, должны использовать почтовый слаг вместо идентификатора

Я предполагаю, что вы в порядке с URL-адресами, начинающимися с /posts (если нет, вам нужно будет определить какой-то другой уникальный шаблон).

Первое изменение требует переопределения определенногоВ случае метода show, использующего маршрутизацию, я добавил что-то вроде match 'posts/*slug перед стандартным маршрутом ресурса.Вот ссылка на руководство по сбору маршрутов: http://guides.rubyonrails.org/routing.html#route-globbing

Следующее изменение, измените существующий метод posts#show, чтобы он искал slug вместо id, например,

def show
  @post = Post.where("slug = ?", params[:slug])
  ...
end

Наконец, измените способ, которым Rails обрабатывает URL-помощник posts_path.Сделайте это, переопределив to_param в вашей модели Post, например,

def to_param
  "/posts/#{slug}"
end

И тогда все готово.Может быть.

После этого посмотрите, как гем friendly_id делает то же самое :-) https://github.com/norman/friendly_id

...