【发布时间】:2015-02-22 01:48:16
【问题描述】:
仅限 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 ,无论其他)来自主题模型对象。
有人知道吗?谢谢!
【问题讨论】:
-
friendly_id它自己使用to_param,你为什么认为这很糟糕?你告诉模型如何在 url 中表示它自己,你认为这是一个 hack,但我认为它是反映整个系统的最干净的方式 -
@MohammadAbuShady,
to_param的功能等同于在模型上使用to_partial方法,该方法会为模型吐出 HTML 表示。我们将模型与视图分开是有原因的,而 URL 只是另一种视图。没有理由让模型任何知道应用程序的路由/URL 方案是什么。 -
好吧,如果我想严格(或愚蠢)并从另一边看,我也可以说路由不应该知道路由使用的属性名称和顺序,所以我不能说会以任何一种方式发生真正的分离,无论如何我不知道你想要的是否可能,你应该找到
url_for的实际实现方式,以及它的行为方式一个 activerecord 对象被传递给它,我很想知道你最后发现了什么,祝你好运, -
我会继续挖掘,如果我弄明白了,我一定会回复的。至于您的观点,这似乎就像在说“我也可以说视图不应该知道以什么顺序将哪些模型字段放在页面上”......这显然没有意义。这就是视图的目的,或者在 URL 的情况下是路由方案。 View->Model 是一个观察者->被观察的关系。依赖项应该只有一种方式。
-
我想这是有道理的,你可以问friendly_id的人,他们可能已经对此做了很多挖掘,有人可能会提供帮助。
标签: ruby-on-rails ruby-on-rails-4 routing ruby-on-rails-4.2 named-routing