1

Есть ли способ убедиться, что пользовательский маршрут распознается методом *_path?Rails 3 настраиваемый маршрут не распознается * _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 

Если вы не используете / отделить кошку, ID и тихоход он будет работать нормально, но при использовании / метод 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?

ответ

0

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

если вы wan't разделить на сегменты пути вы должны положить, что в вашем news_path вызова, как это:

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

см направляющие для более посоветуйте: http://guides.rubyonrails.org/routing.html#segment-constraints

+0

Спасибо за ответ, но решение, которое вы дали мне, будет генерировать ссылку, которая выглядит так: «www.example.com/nieuws/2? cat = category & slug = slug». То, что я пытаюсь достичь, это «www.example.com/nieuws/category/2/slug» или «www.example.com/nieuws/2/slug» для предметов без категории. Есть ли другой способ сделать это, все еще используя 'news_path' или это единственное решение для создания моего собственного метода url/path в моей модели? – christiaanderidder

+0

вы можете создать именованные маршруты с опцией ': as', а затем использовать их вместо метода' news_path'. – phoet

+0

Спасибо за ответ! – christiaanderidder

Смежные вопросы