【问题标题】:Adding URL friendly slugs添加 URL 友好的 slug
【发布时间】:2015-09-08 23:53:21
【问题描述】:

目前我拥有的是

http://www.example.com/_id

我不想在 url 中显示生成的 id,而是在 url 中显示我的帖子标题。比如

http://www.example.com/this_is_a_new_post

我必须为此在集合中添加slug 字段吗?是否有任何解决方案可以让我创建一个友好的 url,并且我不必创建另一个像 slug 这样的冗余字段?

附:我不想使用包。我想它可以很容易地在没有包的情况下完成。

【问题讨论】:

  • 你用的是铁:路由器
  • 是的,我正在使用它进行路由

标签: meteor iron-router meteor-helper


【解决方案1】:

您可以做的最简单的事情就是使用/:title。 Iron 将自动解码标题。 Firefox 可以很好地处理这些 URL。它只是转换它们,因此用户会看到包含所有特殊字符的实际标题。此外,所有的 Iron 助手都正确编码了 URL 字符串。

要创建 slug,您可以使用以下函数:

createURLSlug = function (url) {
  var slugRegex = /[^\w\-\.\~]/g
  while(slugRegex.test(url)) {
    url = url.replace(slugRegex, '-')
  }
  return url
}

我使用wiki page on of allowed URL characters 作为这个正则表达式的参考。

如果您使用SimpleSchema,您也可以使用自动值:

...
  slug: {
    type: String,
    autoValue: function () {
      return createURLSlug(this.field('title').value)
    }
  }
...

【讨论】:

  • 为此我需要在集合中创建一个slug 字段,对吗?这不是让它变得多余吗?而且在路由器而不是/:slug 我需要返回/:title
  • 是的,我会为它创建一个单独的字段,是的,这将是多余的。但是您也可以将大多数缓存中的信息称为冗余。使用 slug 字段作为 cache 可以让您在每次调用路由时都运行该函数。您需要使用/:slug 作为路由的路径。
  • 我在使用此解决方案时确实遇到了错误。我正在使用简单的模式和自动形成。当我尝试提交表单时出现此错误。但是我尝试在 autoform 中使用 hooks 但无济于事。由于 autoValues 默认不添加到 autoform 我使用的是文档中的clean the autovalue
  • 使用autoForm 钩子的问题在于它不是很动态。例如,如果您想使用 somecollection.update 更新,则不会触发挂钩。你遇到了什么错误?
  • 它给出了 deny.insert 错误和 createURLSlug 未定义错误。它在尝试从 autoform 调用 insert 方法时抛出这些错误。
猜你喜欢
  • 2016-04-16
  • 1970-01-01
  • 2018-04-13
  • 2011-07-15
  • 2014-02-09
  • 2014-11-06
  • 1970-01-01
  • 2016-08-17
  • 2015-12-11
相关资源
最近更新 更多