仅限 Ruby on Rails 4.2+,拜托!
我一直在寻找有关如何在 Rails 中使 URL 更漂亮的提示,但我正在努力寻找我喜欢的解决方案。
我想要的是:
假设示例:给定主题、课程等具有一堆字段(包括 URL 友好的 slug)的模型,我希望能够
# ../routes.rb
# Match urls of the form /edu/material-engineering. These are read-only
# public URLs, not resources.
get 'edu/:slug', to: 'education#topic', as: :learn_topic
get 'edu/course/:id/slug', to: 'education#course', as: :learn_course
...
# I also have admin-only resource-oriented controllers for managing
# the content, but that's separate.
namespace :admin do
resource :topic
resource :course
...
end
# ../some_view.html.erb
# Generate URLS like this:
<%= link_to topic.name, learn_topic_path(topic) %>
<%= link_to course.name, learn_course_path(course) %>
我不想要的:
- 胡闹
to_param
。这是一个肮脏的黑客,完全打破了关注点分离。 - 资源/RESTful 路由。除了“读取”之外,这里没有 CRUD 操作。
link_to 'text', course_path(id: course.id, slug: course.slug)
. 这完全违背了不需要视图知道为课程生成 URL 所需的参数的目的。- 编辑:我知道 FriendlyId 存在,但我只是想了解这种事情是如何完成的以及机制是什么,所以这不是现在的解决方案。
必须有一种方法来告诉命名的路由助手从主题模型对象topic_path(topic)
中获取路由中所需的参数(例如,:slug
,:id
,等等)。
有人知道吗?谢谢!