Rails 具有动态段的命名路线 URL 从模型生成
Rails named route with dynamic segments URL generation from model
Ruby 仅限 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
打交道。这是一个肮脏的 hack,完全打破了关注点分离。
- Resource/RESTful路由。除了 "read."
之外,这里没有 CRUD 操作
link_to 'text', course_path(id: course.id, slug: course.slug)
。这完全违背了不需要视图来了解为课程生成 URL 需要哪些参数的目的。
- 编辑:我知道 FriendlyId 存在,但我正试图理解这种事情是如何完成的以及什么机制是,所以这不是现在的解决方案。
有是一种告诉命名路由助手topic_path(topic)
在路由中获取所需参数的方法(例如,:slug
、:id
,等等)来自主题模型对象。
有人知道吗?谢谢!
您可以使用 FriendlyId gem 来实现。
这是link:
https://github.com/norman/friendly_id/blob/master/README.md
如果您有任何问题,请告诉我。
我能想到的最好的办法:用我自己的实现覆盖 *_path
助手。
如果您知道让默认助手工作的方法,请加入!
这个问题归结为一个问题:自动生成的 *_path
和 *_url
助手没有给我想要的灵活性。我想让他们做的是微不足道的,所以没有其他选择,我可以自己写:
module ApplicationHelper
def learn_topic_path(topic)
"/edu/#{topic.slug}"
end
...
end
编写一些 _path/_url 帮助程序覆盖可避免各种复杂情况,并让您远离 to_param、避免包含新插件等
人们可能会更进一步,从已知的路由规则生成路由的静态组件,以及如果动态段名称与模型属性名称一致,则推断需要从模型中提取哪些属性,但是一旦你做更复杂的事情或添加多个模型(例如,'edu/:topic_slug/:course_slug'),它就会开始崩溃。
这样做的最大缺点是现在每次更改路由时都必须在两个地方更新路由:routes.rb
中的路由定义本身以及 [=15= 中的相应路由助手].我现在可以忍受了。
Ruby 仅限 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
打交道。这是一个肮脏的 hack,完全打破了关注点分离。 - Resource/RESTful路由。除了 "read." 之外,这里没有 CRUD 操作
link_to 'text', course_path(id: course.id, slug: course.slug)
。这完全违背了不需要视图来了解为课程生成 URL 需要哪些参数的目的。- 编辑:我知道 FriendlyId 存在,但我正试图理解这种事情是如何完成的以及什么机制是,所以这不是现在的解决方案。
有是一种告诉命名路由助手topic_path(topic)
在路由中获取所需参数的方法(例如,:slug
、:id
,等等)来自主题模型对象。
有人知道吗?谢谢!
您可以使用 FriendlyId gem 来实现。
这是link:
https://github.com/norman/friendly_id/blob/master/README.md
如果您有任何问题,请告诉我。
我能想到的最好的办法:用我自己的实现覆盖 *_path
助手。
如果您知道让默认助手工作的方法,请加入!
这个问题归结为一个问题:自动生成的 *_path
和 *_url
助手没有给我想要的灵活性。我想让他们做的是微不足道的,所以没有其他选择,我可以自己写:
module ApplicationHelper
def learn_topic_path(topic)
"/edu/#{topic.slug}"
end
...
end
编写一些 _path/_url 帮助程序覆盖可避免各种复杂情况,并让您远离 to_param、避免包含新插件等
人们可能会更进一步,从已知的路由规则生成路由的静态组件,以及如果动态段名称与模型属性名称一致,则推断需要从模型中提取哪些属性,但是一旦你做更复杂的事情或添加多个模型(例如,'edu/:topic_slug/:course_slug'),它就会开始崩溃。
这样做的最大缺点是现在每次更改路由时都必须在两个地方更新路由:routes.rb
中的路由定义本身以及 [=15= 中的相应路由助手].我现在可以忍受了。