仅限Ruby on Rails 4.2+!
我一直在寻找有关如何在Rails中创建网址的提示,而且我很难找到我喜欢的解决方案。
我想要的是什么:
假设示例:给定主题,课程等具有大量字段的模型(包括URL友好的slu),我希望能够
# ../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
混淆。这是一个肮脏的黑客行为,完全打破了关注点。link_to 'text', course_path(id: course.id, slug: course.slug)
。这完全违背了不要求视图知道为课程生成URL所需的参数的目的。 是一种告诉命名路由助手topic_path(topic)
在路由中获取所需参数的方法(例如,:slug
主题模型对象中的:id
,等等。
有人知道吗?谢谢!
答案 0 :(得分:0)
您可以使用FriendlyId gem来实现这一目标。
这是链接:
https://github.com/norman/friendly_id/blob/master/README.md
如果您有疑问,请告诉我。
答案 1 :(得分:0)
我能做到的最好:只需用我自己的实现覆盖*_path
助手。
如果您知道如何使默认助手工作,请加入!
此问题可归结为一个问题:自动生成的*_path
和*_url
帮助程序不能为我提供所需的灵活性。我希望他们做的是微不足道的,所以没有其他选择,我可以自己编写:
module ApplicationHelper
def learn_topic_path(topic)
"/edu/#{topic.slug}"
end
...
end
编写一些_path / _url帮助程序覆盖可避免各种复杂化,并允许您远离to_param,避免包含新插件等。
如果动态段名称与模型属性名称对齐,那么可能会向前迈出另一步并从已知路由规则生成路径的静态组件,并推断需要从模型中提取哪些属性,但是一旦你做了更复杂的事情或添加多个模型(例如,&#39; edu /:topic_slug /:course_slug&#39;)就会开始崩溃。
这样做的一大缺点是,每次更改路由时,您现在必须更新两个路径:routes.rb
中的路由定义本身以及application_helper.rb
中的相应路由助手。我现在可以忍受这个。