[英]Rails named route with dynamic segments URL generation from model
请关注Ruby on Rails 4.2+!
我一直在寻找有关如何在Rails中创建URL的技巧,我很难看到我喜欢的解决方案。
我想要的是:
假设的例子:给定主题,课程等具有一堆字段(包括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
,无论如何)。
有人知道吗? 谢谢!
您可以使用FriendlyId gem来实现这一目标。
这是链接:
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
以及在相应的路由帮手application_helper.rb
。 我现在可以忍受。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.