Пользовательский маршрут Rails 3 не распознается методом * _path - PullRequest
1 голос
/ 20 января 2012

Есть ли способ убедиться, что пользовательский маршрут распознается методом *_path?

У меня есть ресурс и собственный маршрут к тому же контроллеру:

resources :news, :only => [:index, :show], :path => :nieuws
match '/nieuws/:cat/:id/:slug', :to => 'news#show'
match '/nieuws/:id/:slug', :to => 'news#show'

Это работает нормально, и при запросе http://www.example.com/nieuws/category/1/slug он покажет правильную новость. Проблема в том, что я хочу использовать метод news_path для ссылки на мои новости. Чтобы добиться этого, я добавил следующий код в модель новостей:

def to_param
  if news_category
    "#{news_category.slug}/#{id}/#{slug}"
  else
    "#{id}/#{slug}"
  end
end

Если не использовать / для разделения cat, id и slug, он будет работать нормально, но при использовании / метод news_path завершится неудачно, и на запрошенной странице отобразится:

No route matches {:action=>"show", :controller=>"news", :id=>#<NewsItem id: 1...etc

Мой rake routes вывод:

news_index GET /nieuws(.:format)                {:action=>"index", :controller=>"news"}
news       GET /nieuws/:id(.:format)            {:action=>"show", :controller=>"news"}
               /nieuws/:cat/:id/:slug(.:format) {:controller=>"news", :action=>"show"}
               /nieuws/:id/:slug(.:format)      {:controller=>"news", :action=>"show"}

Я уже пытался добавить , :id => /[0-9]+\/.+/ в конец моего маршрута к ресурсам, это позволяет использовать /, но поскольку он просто использует регулярное выражение, я не могу получить параметр :cat из URL

Итак, есть ли способ убедиться, что мой пользовательский маршрут распознается методом news_path?

1 Ответ

0 голосов
/ 20 января 2012

Я думаю, что вы используете to_param таким образом, что его нельзя использовать. если у вас есть метод to_param, в качестве искателя также должен быть метод from_param, который всегда должен быть сопоставлен с токеном, а не с путем. то есть "#{news_category.slug}-#{id}-#{slug}" вместо "#{news_category.slug}/#{id}/#{slug}".

если вы не хотите разделять сегменты пути, вам нужно поместить это в ваш news_path вызов следующим образом:

news_path(news, :cat => news_category.slug, :slug => slug)

см. Руководство для получения дополнительной информации: http://guides.rubyonrails.org/routing.html#segment-constraints

...