Rails命名为具有动态段的路由从模型生成URL

时间:2015-02-22 01:48:16

标签: ruby-on-rails ruby-on-rails-4 routing ruby-on-rails-4.2 named-routing

仅限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混淆。这是一个肮脏的黑客行为,完全打破了关注点。
  • 资源/ RESTful路由。除了&#34;读取之外,这里没有CRUD操作。&#34;
  • link_to 'text', course_path(id: course.id, slug: course.slug)。这完全违背了不要求视图知道为课程生成URL所需的参数的目的。
  • 编辑:我知道FriendlyId存在,但我正在努力理解这种事情是如何完成的以及机制是什么,以便& #39;现在不是解决方案。

是一种告诉命名路由助手topic_path(topic)在路由中获取所需参数的方法(例如,:slug主题模型对象中的:id,等等。

有人知道吗?谢谢!

2 个答案:

答案 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中的相应路由助手。我现在可以忍受这个。